用"var {args}"初始化C++ 0x的新特性,还是只是语法糖?

3 c++ syntactic-sugar initializer-list c++11

我正在阅读C++ 0x faq,并且详细介绍了初始化列表.这些例子主要是:

vector<int> vi = { 1, 2, 3 };
vector<int> vj({1, 2, 3});
// etc.
Run Code Online (Sandbox Code Playgroud)

但是,还列出了以下形式:

vector<int> vk{2};
Run Code Online (Sandbox Code Playgroud)

这个形式出现在faq的其他地方,我很好奇它是否在语义上与最初的两种形式不同,或者仅仅是语法糖vk({x, y, z}).

Joh*_*itb 6

({1, 2, 3})形式调用的构造函数vector<int>是直接的,通过作为第一个参数{1, 2, 3}.你本可以传递更多的论点

vector<int> vk({1, 2, 3}, myAllocator);
Run Code Online (Sandbox Code Playgroud)

如果vector<int>没有一个构造函数,其第一个参数是一个initializer_list或另一个类型可以通过{1, 2, 3}(比如,另一个容器类)初始化,它将无法工作.在你的情况下,它的工作原理是因为vector<int>实际上有一个构造函数,其第一个参数是a initializer_list<int>.这就像正常的函数调用一样

void f(vector<int> const& vk);
int main() { f({1, 2, 3}); }
Run Code Online (Sandbox Code Playgroud)

如果省略括号,如同vector<int> vk{1, 2, 3},则确切含义取决于类.A vector<int>有一个初始化列表构造函数,它是一个构造函数,其第一个参数类型initializer_list<int>(可选地是对它的引用),以及所有其他具有默认参数的参数.如果类具有这样的构造函数,则将初始化列表传递给该构造函数.或者,类可以只是一个聚合(比如struct A { int a; int b; int c; };,初始化列表然后会初始化成员)或者有一个接受3单独int参数的构造函数.

最后,= { 1, 2, 3 }表单几乎与省略括号的版本相同(即只是删除=),除了它禁止使用显式构造函数(即,如果他们声明它explicit vector(initializer_list<int>);或者他们声明了explicit vector(int, int, int);相反,如果你使用它会导致错误= { 1, 2, 3 }) .