引用未命名的临时对象(生命期)

时间:2013-03-07 09:39:26

标签: c++ reference temporary object-lifetime

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

3 个答案:

答案 0 :(得分:10)

  

怎么可能这样?

因为标准是这样说的,因为它被认为是有用的。右值引用和const左值引用延长了临时值的生命周期:

  

[C++11: 12.2/5]: [..] 绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象仍然存在   对于参考的生命周期,除了 [..]

[C++11: 8.5.3/5]中的详尽措辞要求我们不要将临时工具绑定到非const左值引用。


  

是否在C ++标准中指定?   哪个版本?

是。所有这些。

答案 1 :(得分:6)

临时绑定到const引用会增加临时值的生命周期,直到常量引用的生命周期。

好读:

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


是的,从引入时间引用开始就在C ++标准中指定了它 因此,如果您想知道这是否是C ++ 11功能,不是不是。它已经存在于C ++ 03中。

答案 2 :(得分: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;
}