std::is_aggregate

来自cppreference.com
< cpp‎ | types
 
 
 
类型支持
基本类型
基础类型
定宽整数类型 (C++11)
数值极限
C 数值极限接口
运行时类型信息
类型特性
类型类别
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++14)
is_aggregate
(C++17)
(C++11)
(C++11)(C++20 前)
(C++11)(C++20 中弃用)
(C++11)
类型特性常量
元函数
(C++17)
常量求值语境
受支持操作
关系与属性查询
类型修改
(C++11)(C++11)(C++11)
类型变换
(C++11)
(C++11)
(C++17)
(C++11)(C++20 前)(C++17)
 
定义于头文件 <type_traits>
template< class T >
struct is_aggregate;
(C++17 起)

检查 T 是否为聚合类型。若 T 为聚合类型,则成员常量 value 等于 true ,否则为 false

std::remove_all_extents_t<T> 是异于(可以有 cv 限定的) void 的不完整类型,则行为未定义。

模板形参

T - 要检查的类型

辅助变量模板

template< class T >
inline constexpr bool is_aggregate_v = is_aggregate<T>::value;
(C++17 起)

继承自 std::integral_constant

成员常量

value
[静态]
T为聚合类型则为 true ,否则为 false
(公开静态成员常量)

成员函数

operator bool
转换对象为 bool ,返回 value
(公开成员函数)
operator()
(C++14)
返回 value
(公开成员函数)

成员类型

 
类型 定义
value_type bool
type std::integral_constant<bool, value>

示例

#include <type_traits>
#include <new>
#include <utility>
 
// 于 p 所指向的未初始化内存构造 T
// 用聚合体的列表初始化,否则使用非列表初始化
template<class T, class... Args>
T* construct(T* p, Args&&... args) {
    if constexpr(std::is_aggregate_v<T>) {
        return ::new (static_cast<void*>(p)) T{std::forward<Args>(args)...};
    }
    else {
        return ::new (static_cast<void*>(p)) T(std::forward<Args>(args)...);
    }
}
 
struct A { int x, y; };
struct B { B(int, const char*) { } };
 
int main() {
    std::aligned_union_t<1, A, B> storage;
    A* a = construct(reinterpret_cast<A*>(&storage), 1, 2);
    B* b = construct(reinterpret_cast<B*>(&storage), 1, "hello");
}