Почему результат объединения следующих путей /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
также является абсолютным путем, поэтому объединение его с что-либо перед ним, по сути, не имеет смысла, абсолютный путь будет иметь приоритет, поэтому конечный результат будет просто /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 находится, если путь не является абсолютным.
"/c/d"
вместо"c/d"
?