以下代码在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()
在进入功能体之前已经死了!
答案 0 :(得分:1)
d_SS.str()在进入函数体之前已经死了!
不正确;它仍然存在,直到当前 full-expression 结束,在这种情况下是aa.f( d_SS.str() );
末尾的分号。
如果aa.f
获取引用或指向其参数的指针并将其保存到某些外部数据区域,则存在危险。 aa.f
只读它的论点是完全安全的。