环境:Linux,g ++ - 4.7
我使用std :: vector和我自己的类来测试它。我发现当使用std :: initializer_list构造一个向量时,它实际上调用了自定义类的复制构造函数来创建一个临时对象。因此,我认为它真的很无效,我使用“const std :: initializer_list& li”来替换它。
为什么它在STL库中真的很常见?例如:
// This is in STL: stl_vector.h
vector(initializer_list<value_type> __l, const allocator_type & __a = allocator_type())
//...
实际上有什么东西在我的脑海里滑动了吗?
我的测试代码如下所示:
#include <iostream>
#include <vector>
#include <initializer_list>
class Test
{
public:
Test(const Test & t) : v(t.v) {
std::cout << "Copy Cons" << std::endl;
}
Test(Test && t) : v(std::move(t.v)) {
std::cout << "MC" << std::endl;
}
Test(int val) : v(val) {}
private:
int v;
};
int main()
{
std::vector<Test> vv({Test(0), Test(1), Test(2)});
return 0;
}//main
它是输出:
Copy Cons
Copy Cons
Copy Cons
答案 0 :(得分:3)
如果仔细查看第一条评论中提供的链接,您将看到复制发生的原因:
您可以看到名为initializer lis的语法元素,即花括号和逗号分隔值列表,作为编译器将该列表的内容放入只读内存块的指令。 std::initializer_list
只不过是该块的一对迭代器。