Я постараюсь ответить:
Точка (1): Нет, оператор вызова не вызывается. Вместо этого он вызывает конструктор. Так как вам все равно нужно создать объект (так как operator+
возвращает копию), это не приводит к дополнительным операциям.
Точка (2): временный result
создается в стеке и, следовательно, не вызывает проблем с памятью (уничтожается при выходе из функции). На return
создается временный файл, так что назначение (или конструктор копирования) может использоваться для присвоения результатов a
(в a=b+c;
) даже после уничтожения result
. Этот временный объект автоматически уничтожается компилятором.
Пункт (3): вышеизложенное предписывает стандарт. Помните, что разработчикам компиляторов разрешается оптимизировать реализацию, если эффект такой же, как предписанный стандартом. Я полагаю, что компиляторы в действительности оптимизируют многие операции копирования, которые происходят здесь. Использование идиомы выше читабельно и не является неэффективным.
P.S. Я иногда предпочитаю реализовывать operator+
как нечлен, чтобы использовать неявное преобразование для обеих сторон операторов (только если это имеет смысл).