以下是在 C++11 中初始化变量的两种方法:
T a {something};
T a = {something};
我在我能想到的所有情况下都测试了这两个,但我没有注意到有什么不同。这个答案表明两者之间存在细微差别:
对于变量,我不太注意
T t = { init };
orT t { init };
样式之间的差异,我发现差异很小,最坏的情况只会导致关于滥用显式构造函数的有用编译器消息。
那么,这两者有什么区别吗?
以下是在 C++11 中初始化变量的两种方法:
T a {something};
T a = {something};
我在我能想到的所有情况下都测试了这两个,但我没有注意到有什么不同。这个答案表明两者之间存在细微差别:
对于变量,我不太注意
T t = { init };
orT t { init };
样式之间的差异,我发现差异很小,最坏的情况只会导致关于滥用显式构造函数的有用编译器消息。
那么,这两者有什么区别吗?
我知道的唯一显着区别是explicit
构造函数的处理:
struct foo
{
explicit foo(int);
};
foo f0 {42}; // OK
foo f1 = {42}; // not allowed
这类似于“传统”初始化:
foo f0 (42); // OK
foo f1 = 42; // not allowed
见[over.match.list]/1。
除此之外,C++11 中存在一个缺陷(参见CWG 1270),它只允许对表单进行大括号省略T a = {something}
struct aggr
{
int arr[5];
};
aggr a0 = {1,2,3,4,5}; // OK
aggr a1 {1,2,3,4,5}; // not allowed