Скажем, у меня есть объект ‘foo’ с конструктором копирования, конструктором перемещения и функцией
foo f() {
foo bar;
/* do some work */
return bar;
}
Похоже, что стандарт утверждает, что компилятор будет пытаться сделать: NRVO, возврат по r-значению ref, возврат по значению, сбой; в этой последовательности.
Есть ли способ заставить компилятор никогда не возвращаться по значению, так как мой конструктор копирования довольно дорогой?
компилятор попытается сделать: NRVO, возврат по r-значению, возврат по значению, сбой; в этой последовательности.
Вышеприведенная формулировка является неточной и может указывать на недопонимание с вашей стороны. Компилятор Можно используйте NRVO (большинство будет), если это не доступно, оно будет всегда возврат по значению, разница в том, как будет построено возвращаемое значение. Если ваш тип имеет конструктор перемещения, компилятор должен используйте этот конструктор и используйте конструктор копирования только в том случае, если ваш тип не имеет конструктора перемещения.
То есть, если ваш тип имеет конструктор перемещения, компилятор, который использовал конструктор копирования, не будет совместим с C ++ 11.
Ваш код никогда не вернется копией, если foo
имеет конструктор рабочего хода.
Вы также можете использовать выходной параметр вместо возврата:
void f(foo& bar) { ... }
Но на практике все компиляторы будут делать NVRO.