使用大括号初始化标量



在 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的情况下(以及所有内置类型(允许大括号初始化,因为它使初始化语法与其他 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 无论是结构类型还是内置类型,也可以统一初始化为:

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)工作。

更新:另请参阅此问题

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

相关内容

  • 没有找到相关文章

最新更新