Компилятор не сможет выполнить (N) RVO в этом случае. (Именованная) оптимизация возвращаемого значения - это оптимизация, при которой компилятор создает функцию авто-переменных вместо возвращаемого значения, чтобы избежать необходимости копировать:
std::string f()
{
std::string result;
//...
return result;
}
Когда компилятор видит приведенный выше код (и, предполагая, что если присутствует какой-либо другой возврат, он также возвратит переменную result
), он знает, что переменная result
имеет только возможную судьбу, копируемую по возвращенному временному затем уничтожен. Затем компилятор может полностью удалить переменную result
и использовать возвращаемую переменную в качестве единственной переменной. Я настаиваю: компилятор не удаляет временный возврат, он удаляет локальную переменную функции. Временное возвращение требуется для выполнения соглашения о вызовах компиляторов.
Когда вы возвращаете члена своего класса, этот член должен существовать, и соглашение о вызовах требует, чтобы возвращаемый объект находился в определенном месте (обычно это адрес стека). Компилятор не может создать атрибут метода для местоположения возвращаемого объекта, а также не может сделать копию.