gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:04:43 26 4
gpt4 key购买 nike

给出以下代码:

#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;
}

通常,预期结果是 /base/append,但实际上是 /append

fs::path::append的说明确实表明了此行为:

If p.is_absolute() || (p.has_root_name() && p.root_name() != root_name()), then replaces the current path with p as if by operator=(p) and finishes.



但是, std::experimental::filesystemboost::filesystem的行为不同,这给出了预期的 /base/append
参见 examples

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

最佳答案

fsAppend是绝对路径,因为它以/开头,并且您所在的系统(例如POSIX)中以/开头的路径是绝对路径。

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

experimental::fs中,规则是,如果第二个参数的.native()以目录分隔符开头,那么即使在其他情况下它可能是绝对路径,它也被视为用于追加目的的相对路径!

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

可以在P0492R2 US77中找到更改的内容。

请注意,您可以使用+=而不是/进行串联(应该做您期望的事情),或者在使用/之前将第二个参数设为相对值。

另请参见this answer,以了解experimental和finalized之间的进一步比较。

关于c++ - 如果p以根路径开头,为什么std::filesystem::path::append替换当前路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55214156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com