Bar*_*rry 14 c++ language-lawyer
根据标准,在[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
Run Code Online (Sandbox Code Playgroud)
sizeof(T&) == sizeof(T)根据定义背后的理由是什么?
Mik*_*our 14
选择有点武断,试图完全证明任何一种选择都会导致循环的形而上学论证.
引用的意图是(对象本身)的别名; 根据这种推理,它们都具有相同的大小(和地址)是有意义的,这就是语言指定的内容.
抽象是漏洞 - 有时一个引用有自己的存储,与对象分开 - 导致像你指出的那样的异常.但是,当我们需要处理作为对象的单独实体的"引用"时,我们有指针.
Mih*_*yan 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
Run Code Online (Sandbox Code Playgroud)
参数2:从C++标准的角度来看,引用是引人注目的,它甚至没有说它们是否占用内存,所以它不能说如何获得它们的大小.
如何获得引用大小:由于所有编译器引用都是通过常量指针的帮助实现的,并且它们占用内存,因此有一种方法可以知道它们的大小.
class A_ref
{A& ref;}
sizeof(A_ref);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5224 次 |
| 最近记录: |