以下是 Effective Modern C++ (第55页)的引用:
“假设你使用一组空括号来构造一个支持默认构造函数的对象,并且还支持std :: initializer_list构造 . 你的空括号是什么意思?等等 . 规则是你得到默认构造 . ”
我用std :: array尝试过这个:
std::array<int, 10> arr{};
并得到g的警告(版本4.8.2):
警告:缺少成员'std :: array <int,10ul> :: _ M_elems'的初始值设定项
这是在尝试从空 std::initializer_list
构造 std::array
时获得的警告(有关此警告的讨论,请参阅Why can I initialize a regular array from {}, but not a std::array) .
那么,为什么上面的代码行不能解释为调用默认构造函数?
1 回答
那是因为std::array是一个聚合,因此aggregate initialization被执行,这包含在draft C++11 standard部分
8.5.4
[dcl.init.list]中,其中说:struct S2 {
int m1;
双m2,m3;
};
S2 s21 = {1,2,3.0}; // 好
S2 s22 {1.0,2,3}; //错误:缩小
S2 s23 {}; // OK:默认为0,0,0
我们可以看到它是不是聚合,然后列表继续说:
我们可以确认
std::array
是23.3.2.1
[array.overview]部分的聚合:引用的
8.5.1
部分是8.5.1
聚合[dcl.init.aggr]并说:然后我们回到
8.5.4
这个我们开始的地方 .