为什么临时对象的引用在这里有效?

时间:2012-04-10 12:23:13

标签: c++ visual-c++

  

可能重复:
  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; 在第一个重载的运算符之后+它返回了一个临时对象,而第二个重载的运算符+意外地工作了!但是运算符+函数的第一个参数是一个参考。为什么临时对象的引用在这里有效,或者有什么我错过了?

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

1 个答案:

答案 0 :(得分:1)

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

但是,将它绑定到非const引用是无效的。编译的唯一原因是因为您的编译器已超过15年,并且该语言从那时起经历了两次重大更改。我建议你升级到这个千年编译器之一。