for 带有容器的循环语法 - 是创建的副本

for loop syntax with containers - Is a copy made?

本文关键字:创建 副本 语法 循环 for      更新时间:2023-10-16

我正在阅读有关迭代STL容器的新C++11语法。到目前为止,我遇到了以下示例:

std::vector<int> plus;
....
for(int l : plus)
{
std::cout << l;
}     

我的问题是上面的语法是否复制了 int?如果是这样,这不是更有效吗?

for(int& l : plus)

从语义上讲,它制作了一个副本,尽管对于内置类型可能没有效率影响,但实际上使用副本甚至可能更便宜。但是,如果复制对象的成本很高,则最好在循环中使用const引用。

std::vector<ExpensiveToCopy> v;
for (const auto& i : v)
  std::cout << i << std::endl;

只有当你想改变对象时,你才应该真正使用非常量引用。

是的,如果你没有明确表示你想要一个参考,你会得到一份副本。对于内置类型,复制实际上更有效 - 当然,除非你想要引用的语义。

它将为向量中的每个元素调用复制构造函数。如果你把它按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)
    {
    }
}