2013-03-07 2 views
3

После прочтения this answer от ildjarn, я написал следующий пример, и похоже, что неназванный временный объект имеет такое же время жизни, как и его ссылка!Ссылка на неназванный временный объект (время жизни)

  • Как это возможно?
  • Он указан в стандарте C++?
  • Какая версия?

код Источник:

#include <iostream> //cout 
#include <sstream> //ostringstream 

int main() 
{ 
     std::ostringstream oss; 
     oss << 1234; 

     std::string const& str = oss.str(); 
     char  const* ptr = str.c_str(); 

     // Change the stream content 
     oss << "_more_stuff_"; 
     oss.str(""); //reset 
     oss << "Beginning"; 
     std::cout << oss.str() <<'\n'; 

     // Fill the call stack 
     // ... create many local variables, call functions... 

     // Change again the stream content 
     oss << "Again"; 
     oss.str(""); //reset 
     oss << "Next should be '1234': "; 
     std::cout << oss.str() <<'\n'; 

     // Check if the ptr is still unchanged 
     std::cout << ptr << std::endl; 
} 

Исполнение:

> g++ --version 
g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54) 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
> g++ main.cpp -O3 
> ./a.out 
Beginning 
Next should be '1234': 
1234 
+4

Тот факт, что ссылки 'const' продлевают срок жизни временных рядов, должны быть покрыты справедливо в вашей книге на C++. –

+1

Вы должны найти свой ответ, если просто попробуете искать в Интернете фразу, которую вы использовали: _temporary объект имеет тот же срок службы, что и его reference_ –

+1

возможный дубликат [Время жизни временных] (http://stackoverflow.com/questions/4214153/lifetime of-temporaries)/посмотреть, что я нашел –

ответ

9

Как это возможно?

Потому что стандарт говорит так, потому что это считается полезным. Ссылки RValue и const ссылки именующей продлить срок службы временные:

[C++11: 12.2/5]:[..] Временными, к которому привязана ссылке или временное, что является полным объектом подобъекта, к которому ссылка привязана сохраняется на протяжении всего срока обращения, за исключением [..]

и исчерпывающее формулировка [C++11: 8.5.3/5] требует, чтобы мы не будем связывать непредставленных временные переменные const Lvalue ссылки.


указано ли это в стандарте С ++? Какая версия?

Да. Все они.

6

Временная граница к константной ссылке увеличивает срок службы временной до жизни постоянной ссылки.

Хорошо читать:

GotW #88: A Candidate For the “Most Important const”


Да указано в стандарте C++ из ссылок времени были введены.
Итак, если вам интересно, является ли это функцией C++ 11, то нет, это не так. Он уже существует в C++ 03.

3

Lightness Races in Orbit является правильным. И я думаю, что этот пример будет более кратким.

#include <iostream> //cout 
#include <string> 

int main() 
{ 
    using namespace std; 
    int a = 123; 
    int b = 123; 
// int  & a_b = a + b; // error! 
    int const & a_b = a + b; 
    cout<<"hello world!"<<endl; 
    cout<<a_b<<endl; 
} 
+0

yep! Я об этом не думал! благодаря ;-) – olibre

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