2016-05-02 3 views
0

Я знаю, что ссылка const продлевает жизнь временного локально. Теперь я спрашиваю себя, если это уместность может быть продлен на цепочке временных объектов, то есть, если я могу с уверенностью определить:Составляет ли константа срок службы временного объекта, возвращаемого временным объектом?

std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2(); 

У меня такое ощущение, что, так как первый метод aBar.getTemporaryObject1() возвращает уже временный объект , уместность не выполняется для aBar.getTemporaryObject2().

+1

Временное действие будет действительным во время выражения, в котором оно появляется. Тот факт, что он возвращает другое временное, не изменяет семантику. Вы все равно можете его захватить. – StoryTeller

+0

@StoryTeller, но это не означает, что первый объект также будет гарантированно действительным в течение срока службы второго, не так ли? –

+0

Нет, конечно нет. Если второй объект содержит ссылку на первую, это будет болтливая ссылка. – StoryTeller

ответ

4

Расширение продолжительности жизни применяется только в том случае, если ссылка напрямую связана с этим временным.

Например, при инициализации другой ссылки из этой ссылки не выполняется другое расширение.

Однако в вашем коде:

std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2(); 

Вы напрямую привязаны к foo возвращаемого значения getTemporaryObject2(), предполагая, что это функция, которая возвращает по значению. Не имеет значения, была ли эта функция членом другого временного объекта или что-то еще. Так что этот код в порядке.

Время жизни объекта, возвращенного getTemporaryObject1() не будет продлен, но это не имеет значения (если getTemporaryObject2 «возвращаемое значение s не содержит ссылки или указатели на этот объект, или что-то, но так как это очевидно std::string, он не мог» т).

3
std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2(); 

действует (TemporaryObject2 продлевается, но не TemporaryObject1)

std::string const& foo = aBar.getTemporaryObject1().member; 

также справедливо (TemporaryObject1 является расширенная).

но

std::string const& foo = aBar.getTemporaryObject1().getReference(); 

не действует: срок службы TemporaryObject1 не распространяется.

0

Данное название является вводящим в заблуждение. Вы не должны возвращать ссылку на местный объект , как указано в названии, но временный объект (возврат по значению).

string & foo1() 
{ 
    string tmp("hello"); 
    return tmp; 
} 

string foo2() 
{ 
    string tmp("hello"); 
    return tmp; 
} 

void foo3() 
{ 
    const string & r1 = foo1(); // crashes later. 
    const string & r2 = foo2(); // Ok, object lives in scope of foo3. 
} 

второй вызов не что иное, как:

const string & r2 = string("hello"); 

Пока функции возвращают по значению, вызов стека не имеет значения. Срок службы последнего объекта будет увеличен до срока его охвата.

+0

название исправлено. –

Смежные вопросы