搞不明白對于<<的多載,第二個引數處加上&之后會莫名報錯,具體來說是
(a,b都是類A的物件)cout<<a;就可以
但是cout<<(a+b);就報錯
我多載的+的回傳值也是一個物件吧,怎么報錯說沒有與運算元匹配的<<運算子呢
代碼見圖
如果在多載<<時第二個引數不加&就不報錯了
求解為什么,謝謝!

uj5u.com熱心網友回復:
const A& auj5u.com熱心網友回復:
謝謝大佬
一個字 ,強!
但是為什么不加const不認呢
uj5u.com熱心網友回復:


個人覺得是因為沒有拷貝函式,如果沒有自定義拷貝函式編譯器也沒有提供就會報錯,因為沒有加&,加一個&就是同名的意思就不會在呼叫拷貝建構式,所以不會在報錯了
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
可是現在情況是寫A a或者const A&a或者const A a才正確
寫A&a,報錯
而且在寫A&a時
如果在呼叫時這樣寫不報錯
A c=a+b;
cout<<c<<endl;
但是寫
cout<<(a+b)<<endl;
就報錯
好奇怪
刪掉我寫的建構式之后情況還是沒變
太難了


uj5u.com熱心網友回復:
謝謝,但是報錯的說明是
沒有與這些運算元匹配的<<運算子
運算元型別為std::ostream<<A
樓上是我剛又試的結果
哇,難搞哦
uj5u.com熱心網友回復:
是拷貝建構式A(const &A)uj5u.com熱心網友回復:
A a,b;A& c=a+b;
c.a=1; 這句對c修改,c是一個參考變數,參考的是a+b回傳的一個臨時變數,回傳值在運算式計算結束時就會被析構,所以這行代碼是錯誤的
uj5u.com熱心網友回復:
const A& a
謝謝大佬
一個字 ,強!
但是為什么不加const不認呢
因為(a+b)回傳一個臨時變數,這個臨時變數你取不到,而且編譯器默認臨時變數是const,所以你要把<<多載函式的第二個引數也設為const,這樣第二個引數才能接收到這個臨時變數
uj5u.com熱心網友回復:
因為const T&被稱為萬能參考,不僅可以系結左值,也可以系結右值,一個臨時變數如果沒有一個const參考系結的話,他的生存期會即可結束,而用了則會延長它的生存期。uj5u.com熱心網友回復:
const A& a
謝謝大佬
一個字 ,強!
但是為什么不加const不認呢
因為(a+b)回傳一個臨時變數,這個臨時變數你取不到,而且編譯器默認臨時變數是const,所以你要把<<多載函式的第二個引數也設為const,這樣第二個引數才能接收到這個臨時變數
謝謝解答!基本明白了!
uj5u.com熱心網友回復:
因為const T&被稱為萬能參考,不僅可以系結左值,也可以系結右值,一個臨時變數如果沒有一個const參考系結的話,他的生存期會即可結束,而用了則會延長它的生存期。
嗯嗯,謝謝解答,很清晰!
uj5u.com熱心網友回復:
多說一句雖然const T& 可以系結右值,但是他是只讀的,使用起來會有限制,因此c++11引入了右值參考,不僅可以延長了臨時變數的生存期,且可以讀寫
代碼如下
int test() {
return 10;
}
int main() {
int&&b = test();
b = 11;
}
uj5u.com熱心網友回復:
多說一句
雖然const T& 可以系結右值,但是他是只讀的,使用起來會有限制,因此c++11引入了右值參考,不僅可以延長了臨時變數的生存期,且可以讀寫
代碼如下
int test() {
return 10;
}
int main() {
int&&b = test();
b = 11;
}
謝謝大佬,好強
果然大佬比百度厲害的多!
謝謝謝謝!!
uj5u.com熱心網友回復:
A a,b;
A& c=a+b;
c.a=1; 這句對c修改,c是一個參考變數,參考的是a+b回傳的一個臨時變數,回傳值在運算式計算結束時就會被析構,所以這行代碼是錯誤的
嗯嗯,終于明白了,謝謝解答!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/104415.html
標籤:C++ 語言
