在C和C++中,可以使用大括号初始化数组和结构:
int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};然而,在2007年的演讲中,Bjarne提到这个语法也适用于标量。我试过:
int i = {7};而且它真的很管用!允许用大括号初始化标量的理由是什么?
注意:我不是专门讨论C++11统一初始化的。这是很好的老C89和C++98。
发布于 2013-01-09 09:41:45
允许用大括号初始化标量的理由是什么?
int是过氧化物酶。因此,在int (以及所有内置类型)的情况下,大括号初始化是允许的,因为它使初始化语法与其他豆荚一致。
此外,我猜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,无论是struct类型还是内置类型,也可以统一初始化为:
header h = header(); //value-initialized
int i = int(); //value-initialized所以我相信一个原因是一致性!
发布于 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:参见此问题
发布于 2013-01-09 10:20:33
C++可能是从C继承的,在C中,主要原因是具有唯一的初始化器语法,特别是对于默认的初始化器。在C中,默认的初始化程序是{0}。
https://stackoverflow.com/questions/14232184
复制相似问题