1

可能重复:
Microsoft VS C++ 编译器可以从临时对象初始化引用是否是一个错误

#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 +之后返回了一个临时对象,第二个重载的operator +意外工作了!但是operator+函数的第一个参数是一个引用。为什么临时对象的引用在这里有效,或者我错过了什么?

PS:VC++6.0编译,运行结果如下。在此处输入图像描述

4

1 回答 1

1

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

const但是,像您一样将其绑定到非引用是无效的。编译的唯一原因是您的编译器已经使用了 15 年以上,并且该语言从那时起经历了两次重大变化。我建议你升级到这个千禧年的编译器之一。

于 2012-04-10T12:30:10.440 回答