Скажем, у меня есть объект 'foo' с конструктором копирования и конструктором перемещения, а также функция
foo f() {
foo bar;
/* do some work */
return bar;
}
В стандарте указано, что компилятор попытается сделать: NRVO, возврат по r-значению ref, возврат по значению, сбой; в этой последовательности.
Есть ли способ заставить компилятор никогда не возвращать значение, поскольку мой конструктор копирования довольно дорог?
f()
всегда возвращает значение и никогда не возвращает ссылку rvalue. NRVO означает, чтоbar
создается в правильном месте для возвращаемого значения. Если бар подвижен, то, если NRVO не может быть выполнено, возвращаемое значение - это перемещение, построенное из бара. Кажется, это то, что вы подразумеваете под «возвратом по r-значению ref», но это неточное описание. Если его нельзя переместить, то он построен по копии. Кажется, это то, что вы подразумеваете под «возвратом по значению», но это также неверно. Опять же,f()
всегда возвращает значение, и внутренние детали того, как создается возвращаемое значение, не меняют этого. - person bames53   schedule 26.11.2012