使用大括号初始化标量

时间:2013-01-09 09:40:13

标签: c++ c initialization language-lawyer list-initialization

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

3 个答案:

答案 0 :(得分:4)

  

允许使用大括号初始化标量的原因是什么?

int是POD。因此,在int(以及所有内置类型)的情况下允许大括号初始化,因为它使初始化语法与其他POD一致

另外,我猜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(无论是struct还是内置类型)也可以统一初始化为:

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

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

答案 1 :(得分:4)

未提及基本原理,但未提及2005 C++ Standard draft 8.5初始值设定项[dcl.init] ,第14条

如果T是标量类型,则表示声明 T x = { a }; 相当于 T x = a;

请注意,C ++ 98 Standard仅允许使用大括号初始化程序进行复制初始化T x = { a },而不允许直接初始化T x { a },只有T x(a)才能正常工作。

更新:另请参阅此question

答案 2 :(得分:1)

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

相关问题