[英]Why a reference is returned in an assignment operator overload?
我讀到,引用是從重載的賦值運算符返回的,以啟用運算符鏈接。 但是,如果沒有這種回報,運營商鏈似乎也可以奏效。
有人可以闡明這一點嗎?
class A
{
public:
int x,y;
char* str;
//Default Constructor
A(){}
//Constructor
A(int a, int b, char* s){
cout<<"initialising\n";
x = a;
y = b;
str = new char[10];
str = s;
}
//Destructor
~A(){}
//Overloaded assignment operator
const A& operator=(const A& obj)
{
cout<<"Invoking Assignment Operator\n";
x = obj.x;
y = obj.y;
str = new char[10];
str = obj.str;
//return *this;
}
};
ostream& operator<<(ostream& os, const A& obj)
{
os <<"X="<< obj.x<<" Y="<<obj.y<<" Str="<<obj.str<<"\n";
return os;
}
int main()
{
A c(3,4,"Object C");
cout<<c;
A d, e, f;
d = e = f = c; //Assignment operator invoked 3 times
cout<<e;
}
輸出:
initialising
X=3 Y=4 Str=Object C
Invoking Assignment Operator
Invoking Assignment Operator
Invoking Assignment Operator
X=3 Y=4 Str=Object C
您正在遇到未定義的行為,因為operator =
期望的返回類型為const A&
並且沒有返回任何內容。
不幸的是它為您工作。 (是的,很不幸,因為似乎有效的未定義行為是最糟糕的)
我在MSVS中遇到編譯錯誤,ideone.com遇到運行時錯誤。
此規則源自如下代碼:
struct Foo {
Foo& copy(const Foo& x) {
return (*this = x);
}
};
當時,C ++有兩點不同:
上面的代碼旨在等同於:
*this = x;
return *this;
但是,這不是-因為operator=
返回了一個右值,編譯器生成了一個臨時變量來保存賦值結果,然后由於該函數返回了引用,因此它返回了對該臨時變量的引用。 然后,當然,事情匆匆忙忙,因為您現在懸而未決地引用了一個臨時對象,該臨時對象在創建它的完整表達式的末尾被銷毀了。 簡而言之,這是一個返回對本地的引用的類情況-除了需要花大量的分析才能意識到本地正在生成時,更不用說對它的引用了。
如果定義operator=
返回值而不是引用,則必須生成一個臨時值,就像編譯器在上面的代碼中所做的一樣。 我沒有仔細考慮其余的內容,以弄清楚在這種情況下當前語言的其他更改是否足以保護您,但是我的直接反應是,您大約要重新構造那個古老的bug,因此,除非您在此問題上別無選擇,否則我會遠離的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.