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)