2012-04-10 4 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 + е; после перегруженного кулаком оператора + он возвратил временный объект, а второй перегруженный оператор + неожиданно сработал! Но первым параметром функции operator + является ссылка. почему ссылка на временный объект действительна здесь, или есть что-то, что я пропустил?

P.S: Он скомпилирован VC++ 6.0 и вот результат выполнения. enter image description here

+0

Это «расширение», поддерживаемое компиляторами MS, так как до стандартизации языка. VS2010 предупреждает об этом. –

+0

К сожалению, я не вижу временных объектов. Где временный объект? –

+0

@MrLister: посмотрите ближе - используемый здесь 'operator +' возвращается по значению, поэтому он действительно является временным. –

ответ

1

Временные объекты продолжаются до конца полного выражения, в котором они созданы - грубо говоря, до ; в конце строки. Ссылки на них действительны до этой точки.

Однако недействительно связывать его с ссылкой на const, как и вы. Единственная причина, по которой компилируется, заключается в том, что вашему компилятору исполнилось более 15 лет, и с тех пор язык прошел через два крупных изменения. Я предлагаю вам перейти на один из компиляторов этого тысячелетия.

+0

Но вам все равно нужна ссылка 'const', чтобы это было четко определено, или я там не прав? –

+0

@ BjörnPollex: Хорошо, я этого не заметил. Я предположил, что это должно быть справедливым, поскольку ОП сказал, что он компилируется; но более внимательно читайте, он только компилируется в доисторическом, нестандартном компиляторе. –

+0

И он не компилируется в наши дни: 'c = c + a.a' является неоднозначным. – jrok

Смежные вопросы