如果 p 以根路径开头,为什么 std::filesystem::path::append 替换当前路径

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::filesystemboost::filesystem不同的是,这给了预期/base/append。请参阅示例

问题是为什么它会这样?为什么用append()函数替换路径?

M.M*_*M.M 6

fsAppend是因为它开始的绝对路径/和你的系统上,如POSIX哪里开始的路径/是绝对的。

将一个绝对路径附加到另一个绝对路径没有任何意义(对我来说,抛出异常实际上是最自然的结果)。C:\foo.txtappend的结果应该C:\bar.txt是什么?

experimental::fs该规则是,如果第二个参数的.native()开始以目录分隔符然后将其处理为追加目的的相对路径,即使它可能在其他情况下的绝对路径!

标准化文件系统清楚地区分了绝对路径和相对路径,试图避免在 POSIX 系统上出现的这种歧义。

可以在P0492R2 US77 中找到更改的记录

请注意,您可以使用+=而不是/用于连接(应该按照您的预期进行),或者在使用之前使第二个参数相对/

另请参阅此答案以进一步比较experimental和最终确定。