将不相关的类型强制转换为空的基类是未定义的行为吗?然后使用该地址构造从该空基继承的派生类型?例如

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没有子对象也没关系。复制对象将访问其值表示形式。即使派生类将覆盖它所做的任何事情(因为空基类没有自己的存储)。

10-04 21:55