C++ 等号对大括号初始化有影响吗?例如';T a={}';vs';T a{}';

C++ 等号对大括号初始化有影响吗?例如';T a={}';vs';T a{}';,c++,c++11,initialization,list-initialization,C++,C++11,Initialization,List Initialization,以下是在C++11中初始化变量的两种方法: T a {something}; T a = {something}; 我在我能想到的所有场景中测试了这两个,但我没有注意到差异。这表明两者之间存在细微差别: 对于变量,我不太注意tt={init}或T{init}样式,我发现差异很小,最坏的情况下只会导致一条关于误用显式构造函数的有用编译器消息 那么,这两者之间有什么区别吗?我所知道的唯一显著区别是对显式构造函数的处理: struct foo { explicit foo(int); };

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

T a {something};
T a = {something};
我在我能想到的所有场景中测试了这两个,但我没有注意到差异。这表明两者之间存在细微差别:

对于变量,我不太注意
tt={init}
T{init}样式,我发现差异很小,最坏的情况下只会导致一条关于误用显式构造函数的有用编译器消息


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

我所知道的唯一显著区别是对
显式
构造函数的处理:

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中还有一个缺陷(请参阅),它只允许对
ta={something}

struct aggr
{
    int arr[5];
};

aggr a0 = {1,2,3,4,5};  // OK
aggr a1 {1,2,3,4,5};    // not allowed

a={something}是否也会导致额外的复制/移动?@gvd否,这就是“传统”复制init和复制列表init的不同之处:
foo f0=42
42
转换为prvalue临时
foo
并使用该临时值直接初始化
f0
(通过可能省略的复制/移动),而
foo f1={42}
选择要使用
42
调用的
f1
构造函数(在这种情况下,复制+移动构造函数可能会被删除)。这是否回答了您的问题@user202729我在那里找不到答案。公认的答案是关于缩小限制,有等号和没有等号的限制。。。。这个问题的要求基本相同,但由于措辞不同,它们吸引了不同类型的答案。在这里链接不会有什么坏处。(顺便说一下,该消息是自动生成的复制标志)