更具体地说,假设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));
}
Run Code Online (Sandbox Code Playgroud)
编辑:我知道所有常见的编译器供应商都以一种与隐式假设兼容的方式实现C++对象布局(即使在考虑虚拟继承时)test
.我正在寻找的是标准中此行为的保证(隐式或显式).或者,也可以接受标准提供的对象存储布局保证范围的相当详细的描述,作为不保证这种行为的证据.
或者,是否有一个带有复制构造函数的类型的示例可以抛出,但是仍然是微不足道的?如果没有,这是否意味着is_nothrow_copy_constructible_v<T>
只要is_trivially_copy_constructible_v<T>
真的应该是真的?
请注意,根据标准(最新草案 [23.15.4.3]),对于不可复制的类型T,我们需要表达式T t(declval<const T&>());
是一个格式良好的变量定义,已知不会抛出任何异常.这个措辞对我来说似乎有点茫然 - 对于要知道什么意味着什么?说明者是否应noexcept
足以建立知识?或者决定是留给实施的?
编辑:我意识到,通过简单的可复制和简单的可复制构造之间存在差异.我的重点是后者.