Почему 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?

Ответы на вопрос(2)

Ваш ответ на вопрос