C++17中聚合的定义
1、任意数组都被称为聚合。
2、具有以下特点的类、结构体或者是共用体:
-没有用户声明的构造函数或者被explict修饰的构造函数。
-没有using Base::Base()这种的构造函数。
struct Data{
};
struct D: public Data{
using Data::Data;
};
-没有private、protected的非静态数据成员。
-没有虚函数。
-没有virtual、private、protected的基类。
C++ 17提供了std::is_aggregate<T>::value 来判断T类型是否是聚合结构(value == True 为聚合)。或者使用辅助函数std::is_aggregate_v<T>来判断。
所以:对于聚合体,在初始化对象时,可用花括号进行对其成员进行赋值
struct B{
int i = 1;
std::string str = "Hello Aggregate";
};
struct D: public B{
double d = 10;
};
int main(){
//聚合初始化。
D d{{100, "Hello World."}, 1};
std::cout << d.i << " " << d.str << " " << d.d << std::endl;
return 0;
}
在c++17前,必须实现出构造函数,才能使用D d{100, "Hello World." , 1}来初始化,在C++17中,可以直接使用上述方法来初始化。
延伸:聚合与static_cast
template<typename T>
struct D : std::string, std::complex<T>
{
std::string data;
};
int main(){
D<float> s{{"hello"}, {4.5,6.7}, "world"}; // OK since C++17
std::cout << s.data << std::endl; // outputs: "world"
std::cout << static_cast<std::string>(s) << std::endl; // outputs: "hello"
std::cout << static_cast<std::complex<float>>(s) << std::endl; // outputs: (4.5,6.7)
return 0;
}