c++14 std::experimental::filesystem::v1 和 c++17 std::filesys
Differences between c++14 std::experimental::filesystem::v1 and c++17 std::filesystem?
我找到了这个页面,描述了 c++14 和 c++17 之间的变化:
https://isocpp.org/files/papers/p0636r0.html
。它链接到此页面,该页面描述了建议的文件系统更改:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0218r0.html
我略过了一遍。标准有一些小的措辞变化,但我看到的唯一代码变化是命名空间更改,删除了"实验"和"v1"部分,因此"std::experimental::文件系统::v1"变成了"std::filesystem",这是意料之中的。
据我所知,除了命名空间路径之外,没有其他更改。有谁知道是否有其他变化?
换句话说,我正在使用带有 -std=c++14 的 gcc。我现在可以使用 std::experimental::文件系统编写代码,并在将来仅更改此命名空间即可轻松切换到 -std=c++17 吗?
我能找到的最接近重复的问题:
Boost 文件系统和标准C++文件系统库有多相似?
现代C++的实验特征对于长期项目是否可靠?
对文件系统库进行更改的主要论文是
- P0219R1,添加相对路径支持
- P0317R1,向
directory_entry
添加缓存 - P0492R2,根据国家机构的评论进行一长串修复和更改
- P0430R2,支持某些非 POSIX 系统
在 LWG 问题列表中也有一些相对较小的修复和更改。查找状态为"C++17"的问题。请注意,其中一些更改随后被上面列出的论文所取代。
对于现有的文件系统 TS 代码,我希望P0492R2是最重要的代码,因为其余的论文大多是功能添加而不是更改。P0492R2包括技术说明和重大语义更改。后一类中立即想到的一些是:
path(".profile").stem()
现在".profile"
operator/
path
如果 rhs 是绝对路径或具有根名称,则其语义发生了重大变化。path("/foo") / "/bar"
现在"/bar"
而不是"/foo/bar"
;path("C:\x") / "D:y"
on Windows 现已"D:y"
.- 旧
absolute
不见了。system_complete
已更名为absolute
。 permissions
的签名略有改动。
延迟回复,但是当我自己寻找同一问题的答案时,我遇到了这个问题。当我终于弄清楚事情时,我想我会在这里发表我的观察结果。
从std::experimental::filesystem
迁移到std::filesystem
时,我遇到了以下更改:
14std::experimental::filesystem c++ | 17std::filesystem | |
---|---|---|
1 | canonical() 有一个重载,它接受一个基本路径,可用于解析第一个参数中传递的路径 | canonical() 没有这个重载,这破坏了我的一些代码 |
2 | canonical() 不会检查路径是否存在 | ,canonical() 会检查路径是否存在,因此,如果在调用此函数时遇到路径可能不存在的情况,请切换到std::filesystem::weakly_canonical |
3 | 插入运算符 (<< ) 按原样给出字符串,不带引号且未转义。 例如C:myfile.txt | 插入运算符 (<< ) 在完整路径周围添加引号并转义反斜杠 ( )。 例如"C:\my\file.txt" 这破坏了我的一些测试,我不得不调用 path 对象的string (或wstring )方法来获取不带引号和未转义的字符串。 |
4 | file_time_type 是std::chrono::system_clock::time_point 的typedef | file_time_type 是std::chrono::time_point<filesystem::_File_time_clock> 的别名。这在我的代码中的某些地方导致了编译错误,我期望它是一个system_clock::time_point 。 |
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么 C++17 中没有 std::construct_at?
- 字符转换功能 std::isupper() & std::islower() C++17
- C++17:使用 std::optional 来评估枚举是否包含值
- 在 Eclipse 上启用 C++17 以使用 'std::byte'
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- clang C++17 std::vector over align type 使用 -mavx 编译时元素 SIGSE
- 如何在 C++17 中检索 std::filesystem::file_time_type 的时钟类型
- 为什么 std::atomic 构造函数在 C++14 和 C++17 中的行为不同
- 为什么 'std::reference_wrapper' 在 c++17 中被弃用,而在 c++20 中被删除?
- 为什么 'std::unary_function' 仍然在 c++17 中编译?
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- c++17通过生成预先声明的类型列表的笛卡尔乘积来生成std::变体
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- std::filesystem::directory_迭代器链接器问题(C++17)
- 在使用 -std=c++17 编译时在 GCC 中复活 std::auto_ptr
- 如何使用 CMake 在 VS2017 中启用 /std:c++17
- 致命错误:在 -std=c++17 的 clang 6.0 中找不到'charconv'文件
- clang-6 和 -std=c++17 -- 不能调用 bind(2)
- 请求C 17的编译器通过使用-STD 17标志在-STD = C 17时,将启用STD ::变体的支持