在C和C中,可以使用大括号初始化数组和结构体:
int a[] = {2,3,5,7}; entry e = {"answer",42};
然而,在a talk from 2007年,Bjarne提到这种语法也适用于标量.我试过了
int i = {7};
它实际上有效!允许使用大括号初始化标量的原理是什么?
注意:我具体不是说C11均匀初始化.这是老C89和C98.
解决方法
What is the rationale behind allowing the initialization of scalars with braces?
int是POD.因此,在int(和所有内置类型)的情况下,允许大括号初始化,因为它使初始化语法与其他POD一致.
另外,我猜想C11统一初始化语法背后的任何理由,也是(部分地)适用于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 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
所以我认为一个原因是一致性!