空 类 的链式继承,还有必要吗?
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.
还有充分的理由使用链式基本案例而不是平面多重继承吗?
以前是这样的,有些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.