c++14 std::experimental::filesystem::v1 和 c++17 std::filesystem 之间的区别?

问题描述 投票:0回答:2

我找到了这个页面,描述了c++14和c++17之间的变化:

https://isocpp.org/files/papers/p0636r0.html

...它链接到此页面,该页面描述了建议的文件系统更改:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0218r0.html

我浏览了一下。标准有一些小的措辞更改,但我看到的唯一代码更改是命名空间更改,删除了“experimental”和“v1”部分,因此“std::experimental::filesystem::v1”变成了“std::filesystem” ”,这是预料之中的。

据我所知,除了命名空间路径之外没有任何改变。有谁知道还有什么改变吗?

换句话说,我使用 gcc 和 -std=c++14。我现在可以使用 std::experimental::filesystem 编写代码,并在将来轻松切换到 -std=c++17 ,只需更改此命名空间吗?

我能找到的最接近的重复问题:

Boost 文件系统和标准 C++ 文件系统库有多相似?

现代 C++ 的实验性功能对于长期项目可靠吗?

c++ c++14 c++17
2个回答
14
投票

对文件系统库进行更改的主要论文是

  • P0219R1,添加相对路径支持
  • P0317R1,添加缓存到
    directory_entry
  • P0492R2,响应国家机构意见的一长串修复和更改
  • P0430R2,支持某些非POSIX系统

还有一些相对较小的修复和更改可以在LWG问题列表中找到。查找“C++17”状态的问题。请注意,其中一些更改将被上面列出的论文取代。


对于现有的文件系统 TS 代码,我预计 P0492R2 是最重要的,因为其余论文主要是功能添加而不是更改。 P0492R2 包括技术澄清和重大语义更改。立即想到的后一类是:

  • path(".profile").stem()
    现在是
    ".profile"
  • 如果 rhs 是绝对路径或具有根名称,则
  • operator/
    上的
    path
    的语义会发生显着变化。
    path("/foo") / "/bar"
    现在是
    "/bar"
    而不是
    "/foo/bar"
    ; Windows 上的
    path("C:\\x") / "D:y"
    现在是
    "D:y"
  • 旧的
    absolute
    已经消失了。
    system_complete
    已更名为
    absolute
  • permissions
    的签名有细微变化。

4
投票

回复延迟,但当我自己寻找同一问题的答案时,我遇到了这个问题。当我终于弄清楚事情时,我想我应该在这里发布我的观察结果。

std::experimental::filesystem
迁移到
std::filesystem
时,我遇到了以下变化:

std::experimental::filesystem
std::filesystem
(C++17)
canonical()
有一个接受基本路径的重载,可用于解析第一个参数中传递的路径
canonical()
没有这种重载,这破坏了我的一些代码
canonical()
不检查路径是否存在
canonical()
会检查路径是否存在,因此如果在调用此函数时遇到路径可能不存在的情况,请切换到
std::filesystem::weakly_canonical
插入运算符 (
<<
) 会按原样提供字符串,不带引号且未转义。例如。
C:\my\file.txt
插入运算符 (
<<
) 在完整路径周围添加引号并转义反斜杠 (
\
)。例如。
"C:\\my\\file.txt"
这破坏了我的一些测试,我不得不调用路径对象的
string
(或
wstring
)方法来获取不带引号和未转义的字符串。
file_time_type
typedef
std::chrono::system_clock::time_point
file_time_type
std::chrono::time_point<filesystem::_File_time_clock>
的别名。这在我的代码中的某些地方导致了编译错误,而我原本期望它是一个
system_clock::time_point
© www.soinside.com 2019 - 2024. All rights reserved.