Допустим, у меня есть этот кусок кода:
class Base {
public:
void f() {}
private:
int n;
};
Base foo()
{
Base b;
// processing
return b;
}
В Base не определен конструктор копирования, и, глядя на его члены, компилятор не будет его синтезировать.
Применяется ли оптимизация именованных возвращаемых значений (NRV) для этого кода? Какое точное правило, когда компилятор будет применять NRV?
Прежде всего, нет точного правила, потому что NRVO явно не является частью стандарта, а скорее разрешено другими частями стандарта. Компилятору никогда не требуется использовать NRVO, и различным компиляторам будет запрещено использовать NRVO различными конструкциями.
В вашей ситуации нет ничего очевидного, чтобы помешать использованию NRVO. Там нет явного деструктора или конструктора копирования, и возвращаемая переменная объявляется вне любого условного блока или блока цикла. Это зависит от того, что происходит в этом // processing
площадь, хотя.
Других решений пока нет …