Подтвердить что ты не робот

Почему boost:: filesystem:: path и std:: filesystem:: path отсутствует оператор +?

Рассмотрим следующие утверждения о разложении пути, где каждая локальная переменная, например. 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 operator+. Но это кажется глупым, так как оно делает то же самое семантически (так зачем заботиться, если он объединяется?). И также кажется, что дизайнеры не заботились о путанице новичков, когда они проектировали path.append("x"), чтобы сделать что-то семантически отличное от str.append("x") и path.concat("x"), чтобы сделать что-то семантически такое же, как str.append("x").

  • Возможно, path неявное преобразование operator string_type() const приведет к неоднозначности некоторого разнообразия p + q. Но я не смог придумать такой случай.

4b9b3361

Ответ 1

Это было введено как дефект в отношении библиотеки файловой системы, а из-за сложности интерфейса и способности работать с помощью преобразования в строки и обратно к путям было признано, что это не дефект. Подробнее читайте здесь: https://timsong-cpp.github.io/lwg-issues/2668