加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 用大括号初始化标量

发布时间:2020-12-16 05:21:31 所属栏目:百科 来源:网络整理
导读:在C和C中,可以使用大括号初始化数组和结构体: int a[] = {2,3,5,7};entry e = {"answer",42}; 然而,在a talk from 2007年,Bjarne提到这种语法也适用于标量.我试过了 int i = {7}; 它实际上有效!允许使用大括号初始化标量的原理是什么? 注意:我具体不是说
在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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读