引用const临时对象的意外行为

时间:2014-11-09 06:54:05

标签: c++ visual-studio-2013

以下代码在Visual Studio 2013中编译时没有任何警告。删除最后一行中的注释将无法编译。这是Visual Studio 2013中的错误吗?如果没有,我怎么能在标准中理解它?

我认为允许引用临时对象是非常危险的,不是吗?

struct A
{
    string a;

    void f( const string & toMove )
    {
        a = toMove;
    }
    void g( string & toMove )
    {
        a = toMove;
    }
} aa;

stringstream d_SS;
d_SS << "A string";
aa.f( d_SS.str() );
//aa.g( d_SS.str() );

修改

在这个related question中,他们解释说'不允许对临时对象进行非const引用'。我的问题是,为什么我们被允许以aa.f( d_SS.str() )的方式获得对临时对象的const引用。 d_SS.str()在进入功能体之前已经死了!

1 个答案:

答案 0 :(得分:1)

  

d_SS.str()在进入函数体之前已经死了!

不正确;它仍然存在,直到当前 full-expression 结束,在这种情况下是aa.f( d_SS.str() );末尾的分号。

如果aa.f获取引用或指向其参数的指针并将其保存到某些外部数据区域,则存在危险。 aa.f只读它的论点是完全安全的。

相关问题