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

标签 c++ c++11 syntactic-sugar initializer-list

我正在阅读 C++0x faq并遇到了详细介绍初始化程序列表的部分。这些示例主要是以下内容的变体:

vector<int> vi = { 1, 2, 3 };
vector<int> vj({1, 2, 3});
// etc.

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

vector<int> vk{2};

这种形式出现在常见问题解答的其他地方,我很好奇它是否与最初的两种形式在语义上有所不同,或者只是 vk({x, y, z}) 的语法糖.

最佳答案

({1, 2, 3})表单调用 vector<int> 的构造函数直接,并作为第一个参数传递 {1, 2, 3} .你本可以传递更多参数

vector<int> vk({1, 2, 3}, myAllocator);

如果vector<int>不会有第一个参数是 initializer_list 的构造函数或者可以由 {1, 2, 3} 初始化的另一种类型(比如,另一个容器类),它不会工作。在你的情况下它有效,因为 vector<int>实际上有一个构造函数,其第一个参数是 initializer_list<int> .这就像在正常的函数调用中一样

void f(vector<int> const& vk);
int main() { f({1, 2, 3}); }

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

最后 = { 1, 2, 3 } form 几乎与省略括号的版本相同(即仅删除 = ),除了它禁止使用显式构造函数(即他们将其声明为 explicit vector(initializer_list<int>); 或者他们声明了 explicit vector(int, int, int); 相反,它会导致如果您使用 = { 1, 2, 3 } 会出错)。

关于c++ - 用 "var{args}"初始化是 C++0x 的新特性,还是仅仅是语法糖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7044281/

相关文章:

C++ - 通过指针表示所有权

c++ - 遍历字符串 vector ,从控制台获取输入,给出段错误

c++ - 可变参数模板模板

rust - impl 没有派生的大型结构的默认糖

c++ - 使用类型作为索引器

c++ - STL性能O(ln(n))题

c++ - <优化出来> 在 ubuntu 中的 gdb

c++ - Dijkstra 最短路径,步数最少

c++ - 没有 typedef 的函数指针

c++ - 试图从输入文件中获取字符