39

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

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

我在我能想到的所有情况下都测试了这两个,但我没有注意到有什么不同。这个答案表明两者之间存在细微差别:

对于变量,我不太注意T t = { init };orT t { init };样式之间的差异,我发现差异很小,最坏的情况只会导致关于滥用显式构造函数的有用编译器消息。

那么,这两者有什么区别吗?

4

1 回答 1

31

我知道的唯一显着区别是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
于 2013-12-22T20:06:00.210 回答