c++ - C++ 对象布局是否必须静态定义?
问题描述
更具体地说,假设A
是 的可访问基类B
,以下代码是否会产生未定义的行为,并且断言是否保证不会根据标准触发?
void test(B b1, B b2) {
A* a2 = &b2;
auto offset = reinterpret_cast<char*>(a2) - reinterpret_cast<char*>(&b2);
A* a1 = reinterpret_cast<A*>(reinterpret_cast<char*>(&b1) + offset);
assert(a1 == static_cast<A*>(&b1));
}
编辑:我知道所有常见的编译器供应商都以与test
. 我正在寻找的是标准中这种行为的保证(隐式或显式)。或者,标准提供的对象存储布局保证范围的合理详细描述,作为不保证此行为的证据,也将被接受。
解决方案
那可能没问题。在某些特定条件下:
A
不是(部分)virtual
基础,或者b1
具有b2
相同的最衍生类型,或者您碰巧(不)幸运。
编辑:您从按引用传递到按值传递的更改使得显示上述条件成立变得微不足道。
别名规则不会妨碍使用的唯一错误类型是char
,并且有一个明确的例外。
推荐阅读
- java - 使用 Jackson 将 JSON 映射到 POJO
- tkinter - 添加标签时列表框调整大小:tkinter
- reactjs - Material-UI 中的颜色枚举“继承”和“默认”是什么意思?
- angular - 部署到heroku后缺少标志问题
- typescript - 在 ng 动态表单中使用 DynamicRadioGroupModel 中的按钮单击事件更改值
- java - 用于查找矩阵中 1 数量的算法(仅垂直 1)。图像是不言自明的,我到底想要什么
- c++ - 如果包含引用成员的类中缺少原始变量,为什么它仍然可以访问?
- python - 如何修复此功能以使其底部不显示“无”?
- javascript - 为什么我不能同时播放 MP3 Base64 字符串?
- batch-file - 批量删除所有子文件夹的子文件夹