这个 C++ C11 语法是什么:“= {}”?

What is this C++ C11 syntax: "= {}"?

我在 C++ 文件中遇到了这个语法:

Obj obj = {};

它有什么作用?它只是调用默认构造函数吗?

这种初始化形式在C++11中称为list-initialization,在C++14中称为copy-list-initialization .它等同于 direct-list-initialization Obj obj{};(在 C++14 的语言中),前提是所需的构造函数是非 explicit,这只是值初始化对象。

(具体含义取决于 Obj 是基本类型还是 class 类型,以及为其声明了何种构造函数。)

表达式两边的大括号表示值的聚合,{} 表示值的空列表。

是的,{} 只是调用默认构造函数。 (它还确保所有成员都以某种方式初始化,即使 class 没有提供默认构造函数。这称为 "value initialization.")

在 C++11 之前,它会使用所有成员的默认值进行聚合初始化。然而,这已经与值初始化相同,即 "calling the default constructor." 的行为(实际上,值初始化是 C++03 发明的一个概念,允许面向构造函数的语法来表示已经存在的东西 aggregate类型。)

有一个小怪癖:它不会调用声明为 explicit 的默认构造函数,而是会产生错误。解决方案永远不会声明 explicit 默认构造函数。如果你坚持使用这样的构造函数,摆脱 = 并说 Obj obj{}.

对于 C,空 {} 的语法无效。对于一个有效的初始值设定项,您至少需要一个字段值。 C 标准将 { 0 } 提升为通用的全零初始值设定项,相当于 C++ 的 {}.