为什么需要使用 const A& 而不仅仅是 A&?

Why it is needed to use const A& instead of just A&?

我想知道为什么在这种情况下需要使用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;
}

A& 是一个左值引用,这意味着它可以改变它正在看的东西。有

A(A& rhs)

你可以这样称呼它

int x = 10;
A a(x);

然后在构造函数中对 rhs 的任何更改都会更改 实际 变量 x。这很好。但是当你这样做时

A a(10);

这是个问题。因为如果有人在构造函数中更改 rhs,那意味着我们必须“更改”数字 10,而这甚至不是一件有意义的事情。例如,10 += 1 在 C++ 中是无稽之谈。

const A& 保证我们不会 更改 所指向的东西,因此传递 [=17 这样的临时值变得安全=] 到函数。

如果我们知道它总是像 int 这样的“小”数据类型,我们可能会按值接受它,但我们不想接受 A 作为参数,因为某些类型(如矢量)的复制成本很高,而其他(如 unique_ptr)则完全不可能复制。

根据您的用例,您可以考虑使用 A&&,一个右值引用。如果您打算将值 移动 到您正在构建的 class 而不是复制它,这将很有用。您可以在 this question 上阅读更多关于移动语义的信息,但如果您刚刚开始使用 C++,最好远离右值引用。不过,很高兴知道它们的存在。