2012-04-10 39 views
1

可能重复:
Is it a bug that Microsoft VS C++ compiler can Initialize a reference from a temporary object为什么临时对象的引用在这里有效?

#include <iostream> 
#include <string> 
using namespace std; 
class test 
{ 
public: 
    string a; 
public: 
    test(string b){a=b;} 
    friend string operator+(test); 
}; 
string operator+(string &c,test a) 
{ 
    c=c+a.a; 
    return c; 
} 
void main() 
{ 
    test d("the "); 
    test e("world!"); 
    string s="Hello "; 
    s=s+d+e; 
    cout<<s<<endl; 
} 

第二最后一行S = S + d + E;在第一个重载操作符+它返回一个临时对象后,第二个重载操作符+意外地工作!但是operator +函数的第一个参数是一个引用。为什么临时对象的引用在这里是有效的,或者有我错过的东西?

P.S:它是由VC++ 6.0编译的,这里是运行结果。 enter image description here

+0

自从语言标准化之前,这是MS编译器支持的“扩展”。 VS2010对此提出警告。 – 2012-04-10 12:28:37

+0

对不起,我没有看到任何临时对象。临时对象在哪里? – 2012-04-10 12:29:26

+0

@MrLister:仔细观察 - 这里使用的'operator +'返回值 - 所以它确实是一个临时的。 – 2012-04-10 12:30:21

回答

1

临时对象持续到创建它们的完整表达式的末尾 - 粗略地说,直到行尾的;。在这之前,对它们的引用是有效的。

但是,像这样将其绑定到非const参考是无效的。编译的唯一原因是因为你的编译器已经超过15年了,从那以后语言经历了两次重大变化。我建议你升级到千禧年的编译器之一。

+0

但是你仍然需要一个'const'引用来定义它,或者我错了吗? – 2012-04-10 12:32:59

+0

@BjörnPollex:好点,我没有发现。我认为自从OP说它编译以来它必须是有效的;但更仔细地阅读,它只是在史前,非标准的编译器中编译。 – 2012-04-10 12:34:10

+0

它现在不编译:'c = c + a.a'不明确。 – jrok 2012-04-10 12:35:00

相关问题