空 类 的链式继承,还有必要吗?

Chained inheritance of empty classes, still necessary?

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

以前是这样的,有些classes是设计成链式继承的。我认为这是强制空基 class 优化。 我知道这就是 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 , "!");}

它是否还有主要或次要用途?

[class.derived]/7 中的标准规定:

A base class subobject may be of zero size.

这意味着编译器不强制执行 EBO。然而几乎所有的编译器都实现了它。

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

The empty member subobjects are permitted to be optimized out just like the empty bases if they use the attribute [[no_unique_address]]. Taking the address of such member results in an address that may equal the address of some other member of the same object.