我想知道為什么在這種情況下需要使用 const A&,為什么我不能只使用 A&?根據我讀到的是因為它指定它不會改變物件。還有其他原因嗎?我想要一個更好的解釋。
代碼:
#include<iostream>
#include<set>
class A{
public:
int x;
A(int x=0): x{x} {std::cout<<"Construct"<<std::endl;};
A(const A& rhs) {x=rhs.x;std::cout<<"Copy"<<std::endl;}
};
bool operator < (const A& lhs,const A& rhs) {return lhs.x<rhs.x;}
int main(){
std::set<A> Set;
A a(10);
Set.insert(a);
Set.emplace(10);
return 0;
}
uj5u.com熱心網友回復:
A&是一個左值參考,這意味著它可以改變它正在查看的東西。和
A(A& rhs)
你可以這樣稱呼它
int x = 10;
A a(x);
然后建構式中的任何更改rhs都會更改實際變數x。這很好。但是當你這樣做時
A a(10);
那是個問題。因為如果有人rhs在建構式中進行了更改,這意味著我們必須“更改”數字10,而這甚至都不是一件有意義的事情。10 = 1例如,在 C 中是無意義的。
const A&是保證我們不會更改所指向的東西,因此將臨時值傳遞10給函式變得安全。
如果我們知道它總是像 一樣的“小”資料型別int,我們可能會按值接受它,但我們不想接受Aas 引數,因為某些型別(如向量)的復制成本可能很高,而其他型別(如unique_ptr)完全無法復制。
根據您的用例,您可以考慮使用A&&右值參考。如果您打算將值移動到正在構建的類中,而不是復制它,這很有用。您可以在此問題上閱讀有關移動語意的更多資訊,但如果您剛開始使用 C ,最好遠離右值參考。不過,很高興知道它們的存在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/447538.html
