我阅读越多关于 C++11 统一初始化的内容,就越感到困惑。 在《Effective Modern C++》(第55页)中,Scott Meyers说:
Widget w2{};
始终调用默认构造函数(即使存在带有 std::initializer_list
参数的构造函数)。
乍一看,这似乎与 Stroustrup 的第四版书籍《C++程序设计语言》一致,例如根据第1200页上的表格,该语句
std::atomic<T> x;
这会使原子变量处于未初始化状态,
std::atomic<T> x {};
调用"default constructor"使x表示一个已初始化的T对象的值。
然而,我无法相信在C++11中std::atomic<T> x;
不再调用默认构造函数,所以我完全困惑了。
最后,在查看C++11标准(n3337草案)之后,我的困惑变得更大了。在第1102页上我们可以看到:
template <> struct atomic<integral > {
//[...] list of non-constructor functions
atomic() noexcept = default;
constexpr atomic(integral ) noexcept;
atomic(const atomic&) = delete;
//[...] other non-constructor functions
};
在第1104页(29.5.5点)中,我们看到:
原子积分特化和专门化原子应具有标准布局。它们各自都应该有一个平凡的默认构造函数和一个平凡的析构函数。它们各自都支持聚合初始化语法。
那么,具有用户定义构造函数的类现在支持聚合初始化了吗?这是因为构造函数是constexpr
吗?
当我们编写以下内容时会发生什么:
std::atomic<T> x {};
这是聚合初始化吗?还是(平凡的)默认构造函数的调用?