【发布时间】:2021-08-16 07:54:03
【问题描述】:
我想声明一种访问类成员(特别是数组位置)的替代方法,如
class Foo {
int a[2];
int &a_first = a[0];
};
这样对Foo 实例中的a_first 的任何访问在所有目的上都等同于访问同一实例的a[0]。
上面的代码可以像我预期的那样处理类的单个实例和单个向量,但是在嵌套向量上使用时,引用地址与成员地址不同:
#include <iostream>
#include <vector>
class A {
public:
int m;
int &mref = m;
};
int main()
{
A a;
std::cout << (&a.m == &a.mref) << '\n'; // output: 1
std::vector<A> av1(1);
std::cout << (&av1[0].m == &av1[0].mref) << '\n'; // output: 1
std::vector<std::vector<A>> av2(1, std::vector<A>(1));
std::cout << (&av2[0][0].m == &av2[0][0].mref) << '\n'; // output: 0
return 0;
}
我认为引用变量充当其分配变量的别名,并在编译时解析,而不是在运行时分配任何实际内存,这与指针不同。为什么这与上面显示的行为不一致?实现我想要的别名的正确方法是什么?
【问题讨论】:
-
尽管问题已回答,但值得一提的另一点。也就是说 std::vector 不执行深度复制,因此您的引用保持不变,因此为了复制引用,您可以覆盖复制构造函数。但请记住,大多数容器是 std 不执行深度复制。因此,如果您的项目中有指针,则应注意这种行为。
标签: c++ class vector reference member