Ссылочная переменная C ++ из метода - PullRequest
4 голосов
/ 04 февраля 2020

Имеет ли смысл сделать это:

class SomeClass
{
public:
    static Object getObject()
    {
        return Object("example")
    }
};

int main()
{
    const Object& myObject = SomeClass::getObject();

    // do something with myObject
}

или это то же самое, что просто получить объект наподобие

const Object myObject = SomeClass::getObject();

?

Ответы [ 2 ]

6 голосов
/ 04 февраля 2020

Из статьи Херба Саттера об этой теме c, которую можно найти здесь , оба случая верны:

Обычно временный объект длится только до конца полного выражения, в котором оно появляется. Тем не менее, C ++ намеренно указывает, что привязка временного объекта к ссылке на const в стеке удлиняет время жизни временного объекта до времени жизни самой ссылки и, таким образом, позволяет избежать того, что в противном случае было бы распространенной ошибкой висячей ссылки.

Но если вы удалите const из случая 1, все будет не в порядке.

0 голосов
/ 04 февраля 2020

При использовании NRVO между ними есть небольшая разница.

Именованная оптимизация возвращаемого значения может работать только с локальной переменной. Ссылка не является:

auto foo() -> Object
{
    const Object& myObject = SomeClass::getObject();
    return myObject; // no NRVO in this case
}

auto foo() -> Object
{
    const Object myObject = SomeClass::getObject();
    return myObject; // NRVO applies in this case
}

Живой пример

...