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

C++ 为什么临时对象的引用在这里有效?,c++,visual-c++,C++,Visual C++,可能重复: #包括 #包括 使用名称空间std; 课堂测试 { 公众: 字符串a; 公众: 测试(字符串b){a=b;} 友元字符串运算符+(测试); }; 字符串运算符+(字符串和c,测试a) { c=c+a.a; 返回c; } void main() { 试验d(“试验”); 测试e(“世界!”); 字符串s=“Hello”; s=s+d+e; cout临时对象一直持续到创建它们的完整表达式的末尾-粗略地说,直到行末尾的;为止。对它们的引用在该点之前是有效的 但是,像您这样将其绑定到非co

可能重复:

#包括
#包括
使用名称空间std;
课堂测试
{
公众:
字符串a;
公众:
测试(字符串b){a=b;}
友元字符串运算符+(测试);
};
字符串运算符+(字符串和c,测试a)
{
c=c+a.a;
返回c;
}
void main()
{
试验d(“试验”);
测试e(“世界!”);
字符串s=“Hello”;
s=s+d+e;

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


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

临时对象将持续到完整表达式结束它们是在其中创建的-粗略地说,直到行尾的
为止。对它们的引用在这一点之前是有效的


但是,像您这样将其绑定到非
常量
引用是无效的。编译的唯一原因是因为您的编译器已经超过15年了,并且自那时以来语言经历了两次重大变化。我建议您升级到本千禧年的编译器之一。

这是一个“扩展”在该语言标准化之前,MS编译器就支持它。VS2010对此发出警告。很抱歉,我没有看到任何临时对象。临时对象在哪里?@MrLister:仔细看-此处使用的
运算符+
按值返回-因此它确实是临时的。但它是一个真正的字符串,一个真正的对象。临时对象的问题在于只有在函数中创建一个对象,然后返回对该对象的引用时,引用才存在,因为该对象在函数结束时会调用其析构函数。这里不是这样!您返回的值是c!@MrLister:
operator+
返回的值是一个临时对象,在完整表达式结束之前有效。您是更正它不是对函数返回时销毁的自动对象的引用;但这不是问题所在。它是一个“扩展”在该语言标准化之前,MS编译器就支持它。VS2010对此发出警告。很抱歉,我没有看到任何临时对象。临时对象在哪里?@MrLister:仔细看-此处使用的
运算符+
按值返回-因此它确实是临时的。但它是一个真正的字符串,一个真正的对象。临时对象的问题在于只有在函数中创建一个对象,然后返回对该对象的引用时,引用才存在,因为该对象在函数结束时会调用其析构函数。这里不是这样!您返回的值是c!@MrLister:
operator+
返回的值是一个临时对象,在完整表达式结束之前有效。您是更正它不是对函数返回时销毁的自动对象的引用;但这不是问题所在。但是你仍然需要一个
const
引用来定义它,还是我错了?@BjörnPollex:好的,我没有发现。我假设它一定是有效的,因为OP说它可以编译;但仔细阅读,它只是在一个史前的非标准编译器中编译的。现在它已经不编译了:
c=c+a.a
是不明确的。但是你仍然需要一个
const
引用才能很好地定义它,还是我错了?@BjörnPollex:好的一点,我没有发现。我认为它一定是有效的,因为EOP说它可以编译;但仔细阅读,它只是在一个史前的非标准编译器中编译的。现在它不编译了:
c=c+a.a
是不明确的。
#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;
}