在C和C++初始化标量,人们可以使用括号初始化数组和结构:用大括号
int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};
然而,在a talk from 2007,Bjarne的提到,此语法也适用于标量。我试过了:
int i = {7};
它实际上工作!允许用大括号初始化标量的原理是什么?
注:我具体是而不是谈论C++ 11统一初始化。这是很好的旧C89和C++ 98。
在C和C++初始化标量,人们可以使用括号初始化数组和结构:用大括号
int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};
然而,在a talk from 2007,Bjarne的提到,此语法也适用于标量。我试过了:
int i = {7};
它实际上工作!允许用大括号初始化标量的原理是什么?
注:我具体是而不是谈论C++ 11统一初始化。这是很好的旧C89和C++ 98。
允许带大括号的标量初始化的基本原理是什么?
int
是POD。因此,在int
(以及所有内置类型)的情况下允许大括号初始化,因为它使得初始化语法与其他POD一致。
此外,我猜无论理由背后的C++ 11统一初始化语法,也(部分)适用于C++ 03允许的这种语法。它只是C++ 03没有扩展到包含非标准容器等非标准类型。
我可以看到一个地方,这个初始化对C++ 03有帮助。
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,无论结构或内置类型,还可以:
template<typename T>
void f()
{
T obj = { size() } ; //T is POD: built-in type or pod-struct
//code
}
现在,这可以与struct
,其与合适的构件,以及任何算术类型开始被实例化统一初始化为:
header h = header(); //value-initialized
int i = int(); //value-initialized
所以我相信一个原因是一致!
的理由没有被提及,但是从2005 C++ Standard draft,8.5初始值设定[dcl.init],第14
如果T是一个标量类型,那么形式的声明 T x = { a };
相当于 T x = a;
注意,C++ 98标准只允许复制初始化T x = { a }
撑初始化,而不是直接初始化T x { a }
,对于只T x(a)
作品。
UPDATE:又见这个question
C++可能继承了这一从C.在C最主要的原因是有一个独特的initilizer语法,特别是用于默认初始值。在C中,默认初始化程序是{0}
。
这只是C++的语法的一部分。允许以这种方式初始化所有对象更加一致,可能会模拟实现。 –
你在尝试使用C++ 11编译器吗? – TemplateRex
类似的话题:([?周围的字符串文字字符数组声明中无效括号] http://stackoverflow.com/questions/10147264/braces-around-string-literal-in-char-array-declaration-valid-eg-char -s) – Nawaz