Я только что прочитал о RVO (Оптимизация возвращаемого значения) и NRVO (Именованная оптимизация возвращаемого значения). Ниже приведены два примера
//Example of RVO
Bar Foo()
{
return Bar();
}
//Example of NVRO
Bar Foo()
{
Bar bar;
return bar;
}
Это имеет смысл, хорошая оптимизация компилятора. Тем не менее, я прочитал из «Учебника по С ++» Стэнли Липпмана, что «Никогда не возвращайте ссылку или указатель на локальный объект» (гл. 6.3.2), пример кода
//disaster: this function returns a reference to a local object
const string &manip()
{
string ret;
// transform ret in some way
if (!ret.empty())
return ret; // WRONG: returning a reference to a local object!
else
return "Empty"; // WRONG: "Empty" is a local temporary string
}
Я не понимаю, этот пример где-нибудь отличается от примера RVO?
Если они одинаковы, как я могу гарантировать, что компилятор выполнит оптимизацию RVO вместо того, чтобы вызывать неопределенное поведение из-за разматывания стека вызовов?
Они разные.
Bar Foo();
возвращает значение, локальный объект копируется.
const string &manip();
возвращается по ссылке, сам локальный объект возвращается, и ссылка недействительна в то же время, что функция возвращает.