Это пример общей техники повторного использования кода для реализации одного оператора в терминах другого.
Предположим, что мы уже определили составной оператор плюс:
class X
{
X & operator+=(const X&);
};
Этот унарныйОператор позволяет нам написать a += b
, он изменяет a
и возвращает ссылку на себя.Это все хорошо и хорошо.Теперь, если мы также хотим предоставить копируемый двоичный оператор плюс оператор a + b
, который возвращает новое значение по значению и оставляет значения a
и b
без изменений, тогда мы хотим воспользоваться уже используемым кодомнаписано для составного оператора.Мы делаем это, вызывая унарный оператор для временной копии из a
:
X X::operator+(const X & b) const { return X(*this) += b; }
^^^^^^^^
temporary copy
Это именно то, что делает ваш код, только более многословно.С таким же успехом вы могли бы написать return MyString(*this) += str;
Существуют и другие идиомы с аналогичным духом, такие как реализация неконстантного доступа с точки зрения константного доступа, копирование-назначение с точки зрения конструкции-копирования и замены,и move-assign в терминах move-construct и swap.Это всегда сводится к тому, чтобы избежать дублирования кода.