C++ 基于范围的 `for` 是否会复制?

问题描述 投票:0回答:1

我正在学习 C++,我正在尝试理解基于范围的 for 循环。 考虑下面的代码

std::array<int,5> items{1,2,3,4,5};

for(int item: items){
   std::cout << std::setw(10) << item;
}
std::cout << std::endl;

for(int item: items){
   item++;
   std::cout << std::setw(10) << item;
}
std::cout << std::endl;

for(int item: items){
    std::cout << std::setw(10) << item;
}
std::cout << std::endl;

打印出来了

1 2 3 4 5
2 3 4 5 6
1 2 3 4 5

因此,我理解

item
取相应元素的值。这让我想知道更复杂的类型会发生什么。我的猜测是
item
是一个局部变量,它获取
items
中相应元素的副本。这是否意味着如果 items 是较大对象的数组,比如

std::array<MyObject,5> items

for 循环获取每个元素的副本?

(ps,我知道我可以使用

int& item: items
更改原始项目的值)。

c++ for-loop c++11
1个回答
1
投票

默认情况下它会复制元素。但是,当引用您得到的项目时,好吧,引用和值将会被更改。

for(int &item: items){
   item++;
}

使用对象时,请避免以这种方式调用复制构造函数。

调用复制构造函数。

for (Object item: items) { }

没有调用复制构造函数

for (Object &item: items) { }

当您需要无复制构造函数调用的性能但又不更改对象时,请将它们设置为 const。

for (const Object &item: items) { }
© www.soinside.com 2019 - 2024. All rights reserved.