c – 用大括号初始化标量

在C和C中,可以使用大括号初始化数组和结构体:
int a[] = {2,3,5,7};
entry e = {"answer",42};

然而,在a talk from 2007年,Bjarne提到这种语法也适用于标量.我试过了

int i = {7};

它实际上有效!允许使用大括号初始化标量的原理是什么?

注意:我具体不是说C11均匀初始化.这是老C89和C98.

解决方法

What is the rationale behind allowing the initialization of scalars with braces?

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

另外,我猜想C11统一初始化语法背后的任何理由,也是(部分地)适用于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 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

所以我认为一个原因是一致性!

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...