Рассмотрим следующие утверждения о разложении пути, где каждая локальная переменная, например. 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
. Но я не смог придумать такой случай.