我总是认为像std::is_same
,std::is_void
或std::is_aggregate
这样的类型应该继承自std::integral_constant
,或者更具体地来自std::bool_constant
。
但是,聚合类不能有基类by definition,但是当我在T
中使用这些类型作为std::is_aggregate_v<T>
时,我得到true
。显然,它们不是来自std::bool_constant
?
所以我的问题是:
为什么std::is_aggregate_v<std::is_aggregate<void>>
是真的,至少对于GCC和Clang?标准是否指定std::is_aggregate
来自std::bool_constant
?如果没有,这是否意味着它将上述行的值留作实现细节?
但是,根据定义,聚合类不能具有基类
这不再是真的。 [dcl.init.aggr]/1将聚合定义为
聚合是一个数组或类
- 没有用户提供的,显式的或继承的构造函数([class.ctor]),
- 没有私有或受保护的非静态数据成员(Clause [class.access]),
- 没有虚拟功能,和
- 没有虚拟,私有或受保护的基类([class.mi])。
[注意:聚合初始化不允许访问受保护和私有基类的成员或构造函数。 - 结束说明]
不再有像C ++ 14及更早版本那样没有基类的条件。只要它具有现在允许的公共非虚拟基类。这意味着类型特征现在被认为是聚合,只要上述情况适用于它们
从C ++ 17开始,具有非虚拟,非私有或受保护库的类是聚合:https://en.cppreference.com/w/cpp/language/aggregate_initialization