首页 > 解决方案 > 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. 我正在寻找的是标准中这种行为的保证(隐式或显式)。或者,标准提供的对象存储布局保证范围的合理详细描述,作为不保证此行为的证据,也将被接受。

标签: c++language-lawyerreinterpret-castobject-layout

解决方案


那可能没问题。在某些特定条件下:

A不是(部分)virtual基础,或者b1具有b2相同的最衍生类型,或者您碰巧(不)幸运。

编辑:您从按引用传递到按值传递的更改使得显示上述条件成立变得微不足道。

别名规则不会妨碍使用的唯一错误类型是char,并且有一个明确的例外。


推荐阅读