2013-01-09 258 views
10

在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。

+1

这只是C++的语法的一部分。允许以这种方式初始化所有对象更加一致,可能会模拟实现。 –

+0

你在尝试使用C++ 11编译器吗? – TemplateRex

+0

类似的话题:([?周围的字符串文字字符数组声明中无效括号] http://stackoverflow.com/questions/10147264/braces-around-string-literal-in-char-array-declaration-valid-eg-char -s) – Nawaz

回答

4

允许带大括号的标量初始化的基本原理是什么?

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 

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

3

的理由没有被提及,但是从2005 C++ Standard draft8.5初始值设定[dcl.init],第14

如果T是一个标量类型,那么形式的声明 T x = { a }; 相当于 T x = a;

注意,C++ 98标准只允许复制初始化T x = { a }撑初始化,而不是直接初始化T x { a },对于只T x(a)作品。

UPDATE:又见这个question

1

C++可能继承了这一从C.在C最主要的原因是有一个独特的initilizer语法,特别是用于默认初始值。在C中,默认初始化程序是{0}