Относительно этого: Почему std::move предотвращает RVO? кто-то написал, что: "Следовательно в операторе возврата исключение копии может произойти только в том случае, если выражение является именем локальной переменной"
Однако я сделал небольшой тест с GCC:
class X
{
public:
X()
{
cout << "def" << endl;
}
X(const X& x)
{
cout << "copy" << endl;
}
X(X&& x)
{
cout << "move" << endl;
}
};
X produceX()
{
return X();
}
int main()
{
X x{produceX()};
return 0;
}
Функция productX не возвращает именованное значение. Он возвращает безымянный временный объект. Однако RVO по-прежнему работает, и нет конструкции копирования или перемещения. Объект x из main создается на месте. Если я напишу productX следующим образом:
X produceX()
{
X localNamedObject;
return localNamedObject;
}
он ведет себя так же (что и ожидается). Но почему в первом случае допускается РВО?