首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用大括号初始化标量

用大括号初始化标量
EN

Stack Overflow用户
提问于 2013-01-09 09:40:12
回答 3查看 1.4K关注 0票数 12

在C和C++中,可以使用大括号初始化数组和结构:

代码语言:javascript
运行
复制
int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};

然而,在2007年的演讲中,Bjarne提到这个语法也适用于标量。我试过:

代码语言:javascript
运行
复制
int i = {7};

而且它真的很管用!允许用大括号初始化标量的理由是什么?

注意:我不是专门讨论C++11统一初始化的。这是很好的老C89和C++98。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-09 09:41:45

允许用大括号初始化标量的理由是什么?

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

此外,我猜C++11统一初始化语法背后的任何理由也(部分)适用于C++03允许的这种语法。只是C++03没有将其扩展到包括标准容器之类的非pod类型。

我可以看到在C++03中这种初始化是有帮助的。

代码语言:javascript
运行
复制
template<typename T>
void f()
{
    T  obj = { size() } ; //T is POD: built-in type or pod-struct
    //code
}

现在可以用struct实例化它以一个合适的成员开始,以及任何算术类型:

代码语言:javascript
运行
复制
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类型还是内置类型,也可以统一初始化为:

代码语言:javascript
运行
复制
header h = header(); //value-initialized
int    i = int();    //value-initialized

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

票数 4
EN

Stack Overflow用户

发布于 2013-01-09 09:54:34

没有提到这个理由,而是来自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)才能工作)。

UPDATE:参见此问题

票数 4
EN

Stack Overflow用户

发布于 2013-01-09 10:20:33

C++可能是从C继承的,在C中,主要原因是具有唯一的初始化器语法,特别是对于默认的初始化器。在C中,默认的初始化程序是{0}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14232184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档