将不相关的类型强制转换为空的基类是未定义的行为吗?然后使用该地址构造从该空基继承的派生类型?例如
class Derived : public EmptyBase {
public:
template <typename T>
Derived(T&& t) : EmptyBase{std::forward<T>(t)} {}
using EmptyBase::print;
};
然后不确定是否要做这样的事情
static auto shim = 1;
auto derived = Derived{*reinterpret_cast<EmptyBase*>(&shim)};
derived.print();
该标准保证必须在标准布局结构中优化空基,但不能确定是否允许类似这样的方法来构造派生类
最佳答案
Derived
的构造函数访问其参数的值表示形式以初始化其基类。该参数的类型为EmptyBase&&
。但该地址没有EmptyBase
对象;该地址有一个int
。
因此,您正在通过与int
不相关的类型的glvalue(EmptyBase&&
)访问int
的值表示形式。这违反了严格的别名。
所以不,你不能只是这样做。
不,EmptyBase
没有子对象也没关系。复制对象将访问其值表示形式。即使派生类将覆盖它所做的任何事情(因为空基类没有自己的存储)。