等号是否会对括号初始化产生影响?例如.'T a = {}'vs'T a {}'

Nik*_*ita 29 c++ initialization c++11 list-initialization

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

T a {something};
T a = {something};
Run Code Online (Sandbox Code Playgroud)

我在所有可以想到的场景中测试了这两个,但我没有发现差异.这个答案表明两者之间存在细微差别:

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

那么,两者之间有什么区别吗?

dyp*_*dyp 25

我所知道的唯一显着差异在于explicit构造函数的处理:

struct foo
{
    explicit foo(int);
};

foo f0 {42};    // OK
foo f1 = {42};  // not allowed
Run Code Online (Sandbox Code Playgroud)

这类似于"传统"初始化:

foo f0 (42);  // OK
foo f1 = 42;  // not allowed
Run Code Online (Sandbox Code Playgroud)

见[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
Run Code Online (Sandbox Code Playgroud)

  • @gvd不,这就是"传统"copy-init和copy-list-init不同的地方:`foo f0 = 42;`将`42`转换为prvalue临时`foo`并用该临时直接初始化`f0`(通过一个可能被省略的复制/移动),而`foo f1 = {42};`选择`f1`的构造函数用`42`调用(在这种情况下可以删除copy + move ctor). (6认同)