多个绝对 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 位于该目录中。
为什么连接以下路径的结果是 /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 byoperator=(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 位于该目录中。