将不相关的类型转换为空基类是不确定的行为?然后使用该地址构造从该空基继承的派生类型?例如
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();
标准保证必须在标准布局结构中优化空基,但不确定是否允许这样的东西构造派生类
答案 0 :(得分:4)
y
Derived{*reinterpret_cast<EmptyBase*>(&shim)}
的构造函数访问其参数的值表示以初始化其基类。参数的类型为Derived
。但是该地址没有EmptyBase&&
个对象;该地址有一个EmptyBase
。
因此,您通过与int
无关的类型的glvalue(int
)访问EmptyBase&&
的值表示。这违反了严格的别名。
所以不,你不能这样做。
不,int
没有子对象并不重要。复制对象将访问其值表示形式。即使派生类会覆盖它所做的任何事情(因为空基类没有自己的存储空间)。