c++ - 为什么 std::is_aggregate聚合?
问题描述
我一直认为类型std::is_same
,std::is_void
或std::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
吗?如果不是,这是否意味着它将上述行的值保留为实现细节?
解决方案
但是,根据定义,聚合类不能有基类
这不再是真的。 [dcl.init.aggr]/1将聚合定义为
聚合是一个数组或一个类
没有用户提供的、显式的或继承的构造函数([class.ctor]),
没有私有或受保护的非静态数据成员(子句 [class.access]),
没有虚函数,并且
没有虚拟、私有或受保护的基类([class.mi])。
[注意:聚合初始化不允许访问受保护和私有基类的成员或构造函数。——尾注]
不再有像 C++14 和更早版本那样没有基类的情况。只要它有一个现在允许的公共的、非虚拟的基类。这意味着类型特征现在被视为聚合,只要上述条件适用于它们
推荐阅读
- android - 在詹金斯中,无法构建 android 构建
- javascript - 无法使用 Express-validator 验证用户输入
- python - PyQt5 中的 Stacked Widget 不会占用完整的主窗口空间
- c# - 使用 Windows 身份验证时,模拟不适用于跨域
- php - 多语言网站的 url 重写问题
- elasticsearch - Elasticsearch 查询 + Agg 搜索查询
- internet-explorer-11 - 使用 UIAutomation 无法识别 IE11 Saveas 框架通知栏子项
- php - Laravel Route 资源不删除表数据?
- ios - 失踪的奥特莱斯
- android - 从移动设备中隐藏 Chrome URL 窗口