C ++: RVO, NRVO и возвращение локальных объектов

Я только что прочитал о 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 вместо того, чтобы вызывать неопределенное поведение из-за разматывания стека вызовов?

0

Решение

Они разные.

Bar Foo();

возвращает значение, локальный объект копируется.

const string &manip();

возвращается по ссылке, сам локальный объект возвращается, и ссылка недействительна в то же время, что функция возвращает.

3

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


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