3

是否还有充分的理由使用链式基本案例而不是平面多重继承?

过去的情况是,某些类被设计成链式继承。我认为这是强制空基类优化。我知道这就是 Boost.Operators 的设计方式。

struct empty{};

template<class Base = empty>
struct A : Base{}; 

template<class Base = empty>
struct B : Base{}; 

template<class Base = empty>
struct C : Base{};

struct S : A<B<C<>>>{};

int main(){static_assert(sizeof(S)==1, "!");}

这在新的编译器中是否有必要(今天是 2019 年),或者我可以放弃所有的复杂性并接受正常的继承?

struct A{}; 

struct B{}; 

struct C{};

struct S : A, B, C{};

int main(){static_assert( sizeof(S) == 1 , "!");}

它不再用于任何主要或次要目的吗?

4

1 回答 1

2

该标准规定[class.derived]/7

基类子对象的大小可能为零。

这意味着 EBO 不是编译器必须实现的。然而几乎所有的编译器都实现了它。

从 C++20 开始,有[[no_unique_address]]可以应用于空成员子对象的属性:

如果空成员子对象使用属性,则可以像空基类一样进行优化[[no_unique_address]]。获取此类成员的地址会产生一个地址,该地址可能等于同一对象的其他一些成员的地址。

于 2019-01-18T05:37:40.307 回答