为什么我们可以非const引用临时对象并延长其生命周期?

时间:2013-11-02 07:51:15

标签: c++ c++11 reference object-lifetime temporary-objects

#include <iostream>

using namespace std;

struct A
{
    A()
        : _p(new int(1))
    {}

    ~A()
    {
        *_p = 0;

        delete _p;
        _p = nullptr;
    }

    int* _p;
};

int main()
{
    //
    // Let r_to_a reference to a temporary object
    //
    A& r_to_a = A();

    //
    // Is r_to_a still valid now?
    //
    cout << *r_to_a._p << endl; // Output : 1 instead of a run-time error
}

正如我所知,非const引用临时对象是不正确的。但是,上面的代码表明它在C ++中似乎是合法的。为什么呢?

我的编译器是VC ++ 2013。

1 个答案:

答案 0 :(得分:2)

代码并没有真正表明它在C ++中是合法的。它只是表明您的编译器支持非标准编译器扩展。您必须查阅编译器文档以确定是否延长了临时文件的生命周期。您的实验似乎表明它已扩展。

然而,您的代码在标准C ++中格式不正确。如果使用/Za选项在该编译器中禁用编译器扩展,它也将拒绝接受您的代码:

error C2440: 'initializing' : cannot convert from 'A' to 'A &'

或者,为避免使用/Za(显然已损坏),您可以执行

#pragma warning(error : 4239)

或更改C/C++ -> Advanced -> Treat Specific Warnings As Errors下的相应项目设置,以更有针对性的方式禁止此特定功能。