Происходит ли оптимизация RVO, когда конструктор копирования не определен для класса?

Допустим, у меня есть этот кусок кода:

class Base {
public:
void f() {}
private:
int n;
};

Base foo()
{
Base b;

// processing

return b;
}

В Base не определен конструктор копирования, и, глядя на его члены, компилятор не будет его синтезировать.
Применяется ли оптимизация именованных возвращаемых значений (NRV) для этого кода? Какое точное правило, когда компилятор будет применять NRV?

0

Решение

Прежде всего, нет точного правила, потому что NRVO явно не является частью стандарта, а скорее разрешено другими частями стандарта. Компилятору никогда не требуется использовать NRVO, и различным компиляторам будет запрещено использовать NRVO различными конструкциями.

В вашей ситуации нет ничего очевидного, чтобы помешать использованию NRVO. Там нет явного деструктора или конструктора копирования, и возвращаемая переменная объявляется вне любого условного блока или блока цикла. Это зависит от того, что происходит в этом // processing площадь, хотя.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]