Почему RVO запрещен при возврате параметра?
В [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?