Мне известно о том, что назначение rvalue для ссылки на константу lvalue продлевает время жизни во времени до конца области. Однако мне непонятно, когда использовать это и когда полагаться на оптимизацию возвращаемого значения.
LargeObject lofactory( ... ) {
// construct a LargeObject in a way that is OK for RVO/NRVO
}
int main() {
const LargeObject& mylo1 = lofactory( ... ); // using const&
LargeObject mylo2 = lofactory( ... ); // same as above because of RVO/NRVO ?
}
Согласно "Более эффективному С++" Скот Майерс (пункт 20), второй метод может быть оптимизирован компилятором для создания объекта на месте (что было бы идеально и точно, чего можно достичь с помощью const&
в первом метод).
- Есть ли общепринятые правила или рекомендации, когда использовать
const&
для временных и когда полагаться на RVO/NRVO? - Может ли быть ситуация, когда использование метода
const&
хуже, чем его использование? (Я думаю, например, о семантике перемещения С++ 11, еслиLargeObject
реализовано...)