@ TomAranda Звучит как ответ для меня.
отрим следующие утверждения о разложении пути, где каждая локальная переменная, например,stem
имеет очевидную инициализацию, напримерauto stem = path.stem()
—
assert(root_path == root_name / root_directory);
assert(path == root_name / root_directory / relative_path);
assert(path == root_path / relative_path);
assert(path == parent_path / filename);
assert(filename == stem + extension);
Это все работает, кроме последней строки - потому чтоfs::path
не определяетoperator+
, В нем естьoperator+=
, но нетoperator+
.
Какая история здесь?
Я решил, что могу сделать этот код компилировать, добавив свой собственныйoperator+
, Есть ли причина не делать этого? (Обратите внимание, что это в моем собственном пространстве имен; я не открываю зановоnamespace std
.)
fs::path operator+(fs::path a, const fs::path& b)
{
a += b;
return a;
}
Мои единственные гипотезы на эту тему:
Может быть, дизайнеры обеспокоены тем, чтоoperator+
было бы слишком легко спутать сstd::string
«soperator+
, Но это кажется глупым, так как семантически делает одно и то же (так зачем беспокоиться, если оно будет смешанным?). И также кажется, что проектировщики не заботились о беспорядке новичков, когда они проектировалиpath.append("x")
делать что-то семантическиразные изstr.append("x")
а такжеpath.concat("x")
делать что-то семантическитот же самый какstr.append("x")
.
Может бытьpath
неявное преобразованиеoperator string_type() const
вызовет некоторое разнообразиеp + q
стать двусмысленным. Но я не смог придумать ни одного такого случая.