【发布时间】:2015-09-25 12:28:51
【问题描述】:
以下引自Effective Modern C++(第55页):
“假设你使用一组空大括号来构造一个支持默认构造函数并且还支持std::initializer_list构造的对象。你的空大括号是什么意思?等等。规则是你得到默认构造。”
我用 std::array: 试过这个
std::array<int, 10> arr{};
并从 g++(版本 4.8.2)得到警告:
警告:缺少成员“std::array
::_M_elems”的初始化程序
这是尝试从空的std::initializer_list 构造std::array 时得到的警告(有关此警告的讨论,请参见Why can I initialize a regular array from {}, but not a std::array)。
那么,为什么上面的代码行不被解释为调用默认构造函数呢?
【问题讨论】:
-
std::array没有采用std::initializer_list的构造函数,并且您在此处拥有的初始化程序也不是std::initailizer_list。它被称为支撑初始化列表。我不确定您为什么会收到警告,因为使用空大括号应该对嵌套数组进行值初始化。 -
@0x499602D2 查看我对链接问题的回答,gcc 具有攻击性,并且更高版本的 gcc 不会产生警告。
-
另请注意,他们在 DR 中以重要的方式更改了 C++11 标准。实际标准说明了一件事,但编译器应该做一些完全不同的事情。
-
@o11c 你指的是哪个DR?我不清楚您指的是哪种行为。
标签: c++ c++11 aggregate-initialization