Min*_*ine 5 c++ boost-filesystem c++17
给出以下代码:
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::path fsBase = "/base";
fs::path fsAppend = "/append";
auto fsResult = fsBase / fsAppend;
std::cout << "fsResult: " << fsResult << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通常,预期的结果是/base/append,但它实际上给出了/append。
fs::path::append的描述确实表明了这种行为:
如果 p.is_absolute() || (p.has_root_name() && p.root_name() != root_name()),然后用 p 替换当前路径,就像用 operator=(p) 并完成一样。
然而,行为std::experimental::filesystem和boost::filesystem不同的是,这给了预期/base/append。请参阅示例。
问题是为什么它会这样?为什么用append()函数替换路径?
fsAppend是因为它开始的绝对路径/和你的系统上,如POSIX哪里开始的路径/是绝对的。
将一个绝对路径附加到另一个绝对路径没有任何意义(对我来说,抛出异常实际上是最自然的结果)。C:\foo.txtappend的结果应该C:\bar.txt是什么?
在experimental::fs该规则是,如果第二个参数的.native()开始以目录分隔符然后将其处理为追加目的的相对路径,即使它可能在其他情况下的绝对路径!
标准化文件系统清楚地区分了绝对路径和相对路径,试图避免在 POSIX 系统上出现的这种歧义。
可以在P0492R2 US77 中找到更改的记录。
请注意,您可以使用+=而不是/用于连接(应该按照您的预期进行),或者在使用之前使第二个参数相对/。
另请参阅此答案以进一步比较experimental和最终确定。
| 归档时间: |
|
| 查看次数: |
2125 次 |
| 最近记录: |