首页 > 解决方案 > 为什么 std::is_aggregate聚合?

问题描述

我一直认为类型std::is_samestd::is_voidstd::is_aggregate应该继承自std::integral_constant,或者更具体地说是继承自std::bool_constant

但是,根据定义,聚合类不能有基类,但是当我在 中使用这些类型Tstd::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++stdc++17typetraits

解决方案


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

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

聚合是一个数组或一个类

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

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

  • 没有虚函数,并且

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

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

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


推荐阅读