Почему оптимизация возвращаемого значения не работает, когда return () - PullRequest
4 голосов
/ 27 марта 2020

Мой код выглядит следующим образом. Почему () делает сбой RVO?

A fn() {
    A a{};
    return (a); // move constructor of class A works
    return a;   // RVO works
}

int main() {
    A a = fn();
    return 0;
}

1 Ответ

7 голосов
/ 27 марта 2020

Это NRVO, а не RVO.

Вот правило, которое допускает NRVO (class.copy / 31):

в операторе возврата в функции с классом тип возврата, когда выражение является именем энергонезависимого автомата c объект (отличный от параметра функции или оператора catch) с тем же типом cv-unqually, что и тип, возвращаемый функцией, Операция копирования / перемещения может быть опущена путем создания объекта автоматизированного c непосредственно в возвращаемое значение функции

Как вы можете видеть, в случае (a) выражение не является именем ( из-за добавленной круглой скобки), поэтому NRVO не допускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...