微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

原文地址:https://www.jb51.cc/c/114907.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐