在 C 和 C++ 中,可以使用大括号初始化数组和结构:
int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};
然而,在2007 年的一次演讲中,Bjarne 提到这种语法也适用于标量。我尝试过这个:
int i = {7};
它确实有效!允许使用大括号初始化标量的基本原理是什么?
注意:我特别不是在谈论 C++11 统一初始化。这是很好的旧 C89 和 C++98。
在 C 和 C++ 中,可以使用大括号初始化数组和结构:
int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};
然而,在2007 年的一次演讲中,Bjarne 提到这种语法也适用于标量。我尝试过这个:
int i = {7};
它确实有效!允许使用大括号初始化标量的基本原理是什么?
注意:我特别不是在谈论 C++11 统一初始化。这是很好的旧 C89 和 C++98。
允许使用大括号初始化标量的基本原理是什么?
int
是 POD。所以大括号初始化是允许的int
(并且对于所有内置类型),因为它使初始化语法与其他 POD一致。
此外,我猜想 C++11 统一初始化语法背后的任何基本原理也(部分)适用于 C++03 允许的这种语法。只是 C++03 没有将其扩展为包括非 pod 类型,例如标准容器。
我可以看到这个初始化在 C++03 中很有帮助的地方。
template<typename T>
void f()
{
T obj = { size() } ; //T is POD: built-in type or pod-struct
//code
}
现在可以实例化struct
它以一个合适的成员开头,以及任何算术类型:
struct header
{
size_t size; //it is the first member
//...
};
f<header>(); //body becomes : header obj = { size(); }; which is fine
f<size_t>(); //body becomes : size_t obj = { size(); }; which is fine
另请注意,POD,无论是结构类型还是内置类型,也可以统一初始化为:
header h = header(); //value-initialized
int i = int(); //value-initialized
所以我相信一个原因是一致性!
基本原理未提及,但来自2005 C++ 标准草案,8.5 Initializers [dcl.init],第 14 条
如果 T 是标量类型,则形式的声明
T x = { a };
等价于
T x = a;
请注意,C++ 98 标准仅允许大括号初始值设定项用于复制初始化T x = { a }
,而不是直接初始化T x { a }
,仅T x(a)
适用于直接初始化。
更新:另见这个问题
C++ 可能从 C 继承了这一点。在 C 中,主要原因是具有独特的初始化程序语法,特别是对于默认初始化程序。在 C 中,默认初始化程序是{0}
.