在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
(以及所有内建类型),因为它使初始化语法与其他荚一致 。
另外,我想任何理由背后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初始值设定[dcl.init],第14
如果T是一个标量类型,那么形式的声明T x = { a };
相当于T x = a;
注意,C ++ 98标准仅允许支架初始化为复制初始化T x = { a }
而不是用于直接初始化T x { a }
对于其中仅T x(a)
的工作原理。
UPDATE:又见这个问题
C ++可能是从C继承在C最主要的原因是有一个独特的initilizer语法,特别是用于默认初始值。 在C默认初始值是{0}