Это указано в [С++ 11:12.8/31]:
Это разрешение операций копирования/перемещения, называемое копированием, разрешено [...]:
- в операторе return в функции с возвращаемым типом класса, когда выражение является именем энергонезависимого автоматического объекта (, кроме функции или параметра catch-clause), с такой же cv-неквалифицированный тип, как тип возвращаемого значения, операцию копирования/перемещения можно опустить, построив автоматический объект непосредственно в возвращаемое значение функции
Это означает, что
#include <iostream>
using namespace std;
struct X
{
X() { }
X(const X& other) { cout << "X(const X& other)" << endl; }
};
X no_rvo(X x) {
cout << "no_rvo" << endl;
return x;
}
int main() {
X x_orig;
X x_copy = no_rvo(x_orig);
return 0;
}
напечатает
X(const X& other)
no_rvo
X(const X& other)
Почему требуется второй конструктор копирования? Не может ли компилятор просто продлить время жизни x?