为什么std :: is_aggregate <T>是一个聚合?

x43*_*2ph 11 c++ std type-traits c++17

我总是给人这样的印象,像std::is_samestd::is_voidstd::is_aggregate应该继承于std::integral_constant或更确切的说是std::bool_constant

但是,聚集类在定义上一定不能具有基类,但是当我像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?如果不是,这是否意味着将上述行的值留作实现细节?

Nat*_*ica 11

但是,根据定义,聚合类不能具有基类

这不再是事实。 [dcl.init.aggr] / 1将汇总定义为

集合是具有以下内容的数组或类

  • 没有用户提供的,显式的或继承的构造函数([class.ctor]),

  • 没有私有或受保护的非静态数据成员(条款[class.access]),

  • 没有虚拟功能,并且

  • 没有虚拟,私有或受保护的基类([class.mi])。

[?注:聚合初始化不允许访问受保护的基类和私有基类的成员或构造函数。?—尾注?]

不再存在没有像C ++ 14和更早版本中那样没有基类的条件。只要它具有现在允许的公共非虚拟基类。这意味着,只要上述情况对类型特征而言,现在就被视为聚合