临时的一生

Saq*_*ain 4 c++

下面的代码显示在函数中创建的对象create()的生命周期延长到const ref创建的生命周期main,这在所有情况下都是正确的吗?我的意思是我们可以通过创建对它的引用来延长某些情况下的临时寿命吗?或者在这种特定情况下,编译器行为不端?

它是用MSVC2005编译的

#include <iostream>

class testClass
{
public:
    testClass()
    {
        std::cout << "in testClass " << ((void*)this) << std::endl;
    }

    ~testClass()
    {
        std::cout << "in ~testClass " << ((void*)this) << std::endl;
    }
};


testClass create()
{
    return testClass();
}


int main()
{
    {
        testClass const& obj = create();

        std::cout << "we got a const reference to obj " << ((void*)&obj) << std::endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产量

in testClass 0018FF13
we got a const reference to obj 0018FF13
in ~testClass 0018FF13
Run Code Online (Sandbox Code Playgroud)

当然其他可能得到不同的地址...在上面的情况下,我期望用函数创建的对象的析构函数create(),将在行之前调用

std::cout << "we got a const reference to obj " << ((void*)&obj) << std::endl; 
Run Code Online (Sandbox Code Playgroud)

被执行.

Arn*_*rtz 6

这是一种特殊情况:将const引用绑定到临时对象,延长其生命周期,直到该const引用超出范围.这仅适用于函数本地const引用,例如以下内容不起作用:

struct X
{
  int const& i
  X(int const& i_) : i(i_) {}
};

int f();

int main()
{
  X x(f()); 
  int u = x.i; //!
}
Run Code Online (Sandbox Code Playgroud)

在构造期间x,i_将被绑定到临时返回的f,i但是虽然它是一个const引用,但是temporarie的生命期不会被延伸到那个i,即规则在这里适用.

请参阅此GOTW文章

更新:正如文章和评论中所提到的,这const是至关重要的.C++标准允许将临时值绑定到const左值引用和rvalue引用,因此int& i = f();不允许.但是,MSVC具有允许此扩展的扩展,并且与其他引用一样,临时的生存期将延长,直到引用超出范围.我不建议使用该扩展,因为它使代码不可移植.事实上,我会小心地将临时工具绑定到引用,因为这个功能并不为人所知,并且你的同事可能会觉得它看起来很困惑,这意味着代码缺乏可读性.


归档时间:

查看次数:

302 次

最近记录:

13 年,5 月 前