为什么引用在C++中不可重新分配?



通常,我使用引用是因为它们在指针上的非空性。然而,我遇到了一些问题,比如想要在vector中存储引用,或者想要在一个可以重新赋值的对象中使用一个非空字段,除了因为引用不能重新赋值之外,我不得不使用指针。

为什么这是引用的一个特性?我看不出这能带来什么好处,而且在很多情况下,我只想要一个没有其他包袱的非空指针。有一些模棱两可的情况下或者编译器限制证明为什么这样的语言是?

列出的重复项详细说明了为什么不能重新分配引用。但它们只适用于独立引用,而不适用于类中的引用。

在c++20中,如果引用(和const)是类成员,则可以重新赋值,但必须编写复制赋值。c++20改变了以前版本中不可能的规则。

下面是一个简单的例子:

#include <vector>
#include <memory>
#include <algorithm>
struct A {
int& ri;
A(int& ri) :ri(ri) {};
A& operator=(const A& rhs) {
std::destroy_at(this);  // only needed if class is not trivially destructable
std::construct_at(this, rhs);
return *this;
}
};
int main()
{
int i0{ 6 }, i1{ 5 };
std::vector<A> v;
v.emplace_back(A{ i0 });
v.emplace_back(A{ i1 });
std::sort(v.begin(), v.end(), [](const A& a, const A& b) {return a.ri < b.ri; });
std::cout << v[0].ri << 'n';
std::cout << v[1].ri << 'n';
v[0] = v[1];    // references are reassigned
std::cout << v[0].ri << 'n';
std::cout << v[1].ri << 'n';
}

最新更新