我正在阅读有关迭代STL容器的新C ++ 11语法。 到目前为止,我遇到了以下示例:
std::vector<int> plus;
....
for(int l : plus)
{
std::cout << l;
}
我的问题是上面的语法是否复制了int? 如果是这样,这会更有效率吗?:
for(int& l : plus)
答案 0 :(得分:8)
从语义上讲,它是一个副本,虽然对于内置类型可能没有效率,实际上使用副本甚至可能更便宜。但是如果复制对象的成本很高,最好在循环中使用const
引用。
std::vector<ExpensiveToCopy> v;
for (const auto& i : v)
std::cout << i << std::endl;
如果你想改变对象,你应该只使用非const引用。
答案 1 :(得分:5)
是的,如果您没有明确表示您想要参考,那么您将获得一份副本。使用内置类型,它实际上更有效地获取副本 - 当然,除非你想要引用的语义。
答案 2 :(得分:2)
它将为向量中的每个元素调用复制构造函数。如果你通过const reference
获取它,它根本不会调用任何构造函数。如果您不打算改变元素,则应使用const
。例如:
class Test
{
public:
Test() { std::cout << "Default.\n"; }
~Test() { }
Test(const Test& other) { std::cout << "Copy.\n"; }
Test(Test&& other) { std::cout << "Move.\n"; }
};
int main()
{
std::vector<Test> test;
test.emplace_back(Test());
for (const Test& t : test)
{
}
}