根据标准,在[expr.sizeof](5.3.3.2)中我们得到:
当应用于引用或引用类型时,结果是引用类型的大小。
这似乎与未指定引用的事实一致[dcl.ref](8.3.2.4):
未指明引用是否需要存储
但是在我的语言中出现这种不一致似乎很奇怪。无论参考是否需要存储,能否确定参考使用的尺寸是否重要?看到这些结果似乎是错误的:
sizeof(vector<int>) == 24
sizeof(vector<int>*) == 8
sizeof(vector<int>&) == 24
sizeof(reference_wrapper<vector<int>>) == 8
根据定义想要sizeof(T&) == sizeof(T)
背后的原因是什么?
答案 0 :(得分:14)
这种选择有些武断,试图完全证明这两种选择都会导致循环的形而上学论证。
引用的意图是(对象本身)的别名;根据这种推理,它们都具有相同的大小(和地址)是有意义的,这就是语言指定的内容。
抽象是漏洞的 - 有时一个引用有自己的存储空间,与对象分开 - 导致像你指出的那样的异常。但是,当我们需要将“引用”作为对象的单独实体处理时,我们有指针。
答案 1 :(得分:13)
参数1:引用应该是对象的同义词,因此引用的接口应该与对象的接口完全相同,所有运算符也应该以相同的方式工作对象和引用(类型操作符除外)。
在以下代码中有意义:
MyClass a;
MyClass& b = a;
char a_buf[sizeof(a)];
char b_buf[sizeof(b)]; // you want b_buf be the same size as a_buf
memcpy(&a, a_buf, sizeof(a));
memcpy(&b, b_buf, sizeof(b)); // you want this line to work like the above line
参数2:从C ++标准的角度来看,引用是引人注目的,它甚至没有说它们是否占用了内存,所以它无法说明如何获得它们的大小。 / p>
如何获取参考大小:由于所有编译器的引用都是通过常量指针的帮助实现的,并且它们占用了内存,因此有一种方法可以了解它们的大小。
class A_ref
{A& ref;}
sizeof(A_ref);
答案 2 :(得分:3)
了解引用需要多少存储空间并不是特别重要,只需要通过添加引用来改变存储要求。而你可以确定:
struct with
{
char c;
T& ref;
};
struct without
{
char c;
};
return sizeof (with) - sizeof (without);