等号在大括号初始化中是否有影响?例如。 'T a = {}'与'T a{}'

Does the equal sign make a difference in brace initialization? eg. 'T a = {}' vs 'T a{}'

本文关键字:例如 初始化 有影响 是否      更新时间:2023-10-16

以下是在C++11中初始化变量的两种方法:

T a {something};
T a = {something};

我在我能想到的所有场景中测试了这两个,但我没有注意到区别。这个答案表明两者之间有一个微妙的区别:

对于我不太注意T t = { init };T 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