- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读 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/
我将 XMonad.Hooks.DynamicLog 中的 dynamicLogWithPP 与 dzen2 一起用作 xmonad 下的状态栏。我想在栏中显示的内容之一是当前播放轨道的剩余时间(如果
我是一名优秀的程序员,十分优秀!