Форсирование конструкции RVO / move при возврате по значению

Скажем, у меня есть объект ‘foo’ с конструктором копирования, конструктором перемещения и функцией

foo f() {
foo bar;
/* do some work */
return bar;
}

Похоже, что стандарт утверждает, что компилятор будет пытаться сделать: NRVO, возврат по r-значению ref, возврат по значению, сбой; в этой последовательности.

Есть ли способ заставить компилятор никогда не возвращаться по значению, так как мой конструктор копирования довольно дорогой?

4

Решение

компилятор попытается сделать: NRVO, возврат по r-значению, возврат по значению, сбой; в этой последовательности.

Вышеприведенная формулировка является неточной и может указывать на недопонимание с вашей стороны. Компилятор Можно используйте NRVO (большинство будет), если это не доступно, оно будет всегда возврат по значению, разница в том, как будет построено возвращаемое значение. Если ваш тип имеет конструктор перемещения, компилятор должен используйте этот конструктор и используйте конструктор копирования только в том случае, если ваш тип не имеет конструктора перемещения.

То есть, если ваш тип имеет конструктор перемещения, компилятор, который использовал конструктор копирования, не будет совместим с C ++ 11.

9

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

Ваш код никогда не вернется копией, если foo имеет конструктор рабочего хода.

2

Вы также можете использовать выходной параметр вместо возврата:

void f(foo& bar) { ... }

Но на практике все компиляторы будут делать NVRO.

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