使用大括号初始化标量

在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 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
(); //body becomes : header obj = { size(); }; which is fine f(); //body becomes : size_t obj = { size(); }; which is fine

另请注意,POD(无论是struct还是内置类型)也可以统一初始化为:

 header h = header(); //value-initialized int i = int(); //value-initialized 

所以我相信一个原因就是一致性!

没有提到基本原理,但是从2005 C ++标准草案 , 8.5初始化[dcl.init] ,第14条

如果T是标量类型,那么formsT x = { a }; 相当于T x = a;

请注意,C ++ 98标准仅允许用于复制初始化T x = { a }大括号初始化器,而不允许直接初始化T x { a } ,只有T x(a)才能工作。

更新 :另见这个问题

C ++可能是从Cinheritance的。在C中,主要原因是具有唯一的initilizer语法,特别是对于默认的初始化程序。 在C中,默认初始值设定项为{0}