小编典典

基于范围的循环:按值获取项目或引用 const?

all

阅读一些基于范围的循环示例,他们提出了两种主要方式1 , 2 ,
3 ,
4

std::vector<MyClass> vec;

for (auto &x : vec)
{
  // x is a reference to an item of vec
  // We can change vec's items by changing x 
}

或者

for (auto x : vec)
{
  // Value of x is copied from an item of vec
  // We can not change vec's items by changing x
}

好。

当我们不需要更改vec项目时,IMO,示例建议使用第二个版本(按值)。为什么他们不建议const参考的东西(至少我没有找到任何直接的建议):

for (auto const &x : vec) // <-- see const keyword
{
  // x is a reference to an const item of vec
  // We can not change vec's items by changing x 
}

不是更好吗?它不是避免在每次迭代中出现冗余副本const吗?


阅读 71

收藏
2022-05-10

共1个答案

小编典典

如果您不想更改项目并且想要 避免 复制,那么auto const &是正确的选择:

for (auto const &x : vec)

谁建议你使用auto &都是错误的。别理他们。

这是回顾:

  • 选择auto x何时要使用副本。
  • 选择auto &x何时要使用原始项目并可以修改它们。
  • 选择auto const &x何时要使用原始项目并且不会修改它们。
2022-05-10