为什么std :: is_aggregate 聚合?

问题描述 投票:11回答:2

我总是认为像std::is_samestd::is_voidstd::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?如果没有,这是否意味着它将上述行的值留作实现细节?

c++ std c++17 typetraits
2个回答
11
投票

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

这不再是真的。 [dcl.init.aggr]/1将聚合定义为

聚合是一个数组或类

  • 没有用户提供的,显式的或继承的构造函数([class.ctor]),
  • 没有私有或受保护的非静态数据成员(Clause [class.access]),
  • 没有虚拟功能,和
  • 没有虚拟,私有或受保护的基类([class.mi])。

[注意:聚合初始化不允许访问受保护和私有基类的成员或构造函数。 - 结束说明]

不再有像C ++ 14及更早版本那样没有基类的条件。只要它具有现在允许的公共非虚拟基类。这意味着类型特征现在被认为是聚合,只要上述情况适用于它们


3
投票

从C ++ 17开始,具有非虚拟,非私有或受保护库的类是聚合:https://en.cppreference.com/w/cpp/language/aggregate_initialization

© www.soinside.com 2019 - 2024. All rights reserved.