@ 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 стать двусмысленным. Но я не смог придумать ни одного такого случая.

Ответы на вопрос(1)

Ваш ответ на вопрос