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

21
задан Mankarse 25 February 2012 в 14:33
поделиться