多个绝对 std::filesystem::path 实例的串联

Concatenation of multiple absolute std::filesystem::path instances

为什么连接以下路径的结果是 /c/d

std::filesystem::path{"/a"} / std::filesystem::path{"b"} / std::filesystem::path{"/c/d"}

到目前为止,我的心智模型将生成的路径设置为 /a/b/c/d。令我惊讶的是,它只是 /c/d。很想知道我哪里出错了。 (以及正确的心智模型是什么)

/a 是绝对路径,b 是相对路径,因此将它们串联起来会产生 /a/b.

但是/c/d也是绝对路径,所以跟前面的anything拼接起来基本就是一个no-op,绝对路径就取优先级,所以最后的结果就是 /c/d.

这在 cppreference.com 上有更详细的讨论:

std::filesystem::operator/(std::filesystem::path)

Concatenates two path components using the preferred directory separator if appropriate (see operator/= for details).

Effectively returns path(lhs) /= rhs.

std::filesystem::path::operator/=

path& operator/=( const path& p );

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.

要获得您想要的结果,请从 /c/d 中删除前导 / 以使其成为相对路径:

std::filesystem::path{"/a"} / std::filesystem::path{"b"} / std::filesystem::path{"c/d"}

what the right mental model is

a / b 表示“如果 b 不是绝对的,那么它是相对于 a”。

如果路径不是绝对路径,这会让您拥有一个“默认”基本目录,假定 rhs 位于该目录中。