fre*_*low 12 c c++ initialization language-lawyer list-initialization
在C和C++中,可以使用大括号初始化数组和结构:
int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};
Run Code Online (Sandbox Code Playgroud)
然而,在2007年的一次演讲中,Bjarne提到这种语法也适用于标量.我尝试过这个:
int i = {7};
Run Code Online (Sandbox Code Playgroud)
它确实有效!允许使用大括号初始化标量的原理是什么?
注意:我特别不是在谈论C++ 11统一初始化.这是很好的旧C89和C++ 98.
允许用大括号初始化标量背后的理由是什么?
int
是POD。int
因此,在(以及所有内置类型)情况下允许大括号初始化,因为它使初始化语法与其他 POD一致。
另外,我猜想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
}
Run Code Online (Sandbox Code Playgroud)
现在可以实例化它,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
Run Code Online (Sandbox Code Playgroud)
另请注意,POD,无论是结构体还是内置类型,也可以统一初始化为:
header h = header(); //value-initialized
int i = int(); //value-initialized
Run Code Online (Sandbox Code Playgroud)
所以我相信原因之一就是一致性!
归档时间: |
|
查看次数: |
1059 次 |
最近记录: |