Это указано в [C ++ 11: 12.8 / 31]:
Это исключение операций копирования / перемещения, называемое исключением копирования, разрешено [...]:
- в операторе возврата в функции с типом возврата класса, когда выражение является именем энергонезависимого автоматического объекта ( кроме функции или предложения catch параметр ) с тем же типом cv-unqualified, что и тип возвращаемого значения функции, операция копирования / перемещения может быть опущена путем создания автоматического объекта непосредственно в возвращаемом значении функции
Это означает, что
#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 ?