Можно создать дубликат:
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 + е; после перегруженного кулаком оператора + он возвратил временный объект, а второй перегруженный оператор + неожиданно сработал! Но первым параметром функции operator + является ссылка. почему ссылка на временный объект действительна здесь, или есть что-то, что я пропустил?
P.S: Он скомпилирован VC++ 6.0 и вот результат выполнения.
Это «расширение», поддерживаемое компиляторами MS, так как до стандартизации языка. VS2010 предупреждает об этом. –
К сожалению, я не вижу временных объектов. Где временный объект? –
@MrLister: посмотрите ближе - используемый здесь 'operator +' возвращается по значению, поэтому он действительно является временным. –