将无关类型的对象重新解释为一个空类

时间:2018-01-16 02:25:06

标签: c++ c++11 language-lawyer undefined-behavior reinterpret-cast

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

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();

标准保证必须在标准布局结构中优化空基,但不确定是否允许这样的东西构造派生类

1 个答案:

答案 0 :(得分:4)

y

Derived{*reinterpret_cast<EmptyBase*>(&shim)} 的构造函数访问其参数的值表示以初始化其基类。参数的类型为Derived。但是该地址没有EmptyBase&&个对象;该地址有一个EmptyBase

因此,您通过与int无关的类型的glvalue(int)访问EmptyBase&&的值表示。这违反了严格的别名。

所以不,你不能这样做。

不,int没有子对象并不重要。复制对象将访问其值表示形式。即使派生类会覆盖它所做的任何事情(因为空基类没有自己的存储空间)。