c++ - 强制 auto 成为循环范围内的引用类型

标签 c++ c++11 for-loop range auto

假设我有 foo这是一个填充std::vector<double> .

我需要对这个 vector 的元素进行操作。我有写作的动力

for (auto it : foo){
   /*ToDo - Operate on 'it'*/
}

但这似乎不会写回foo自从 it是值类型:已获取 vector 元素的深层拷贝。

我可以给 auto 一些指导吗?制作 it引用类型?然后我可以直接在it上操作.

我怀疑我遗漏了一些琐碎的语法。

最佳答案

一个最小的auto引用

循环可以声明如下:

for (auto& it : foo) {
   //    ^ the additional & is needed
   /*ToDo - Operate on 'it'*/
}

这将允许 it 成为对 foo 中每个元素的引用。

关于这些循环的“规范形式”存在一些争论,但 auto& 在这种情况下应该可以解决问题。

一般auto引用

在更一般的意义上(在容器的细节之外),以下循环有效(并且可能更可取)。

for (auto&& it : container) {
   //    ^ && used here
}

auto&& 允许绑定(bind)到左值和右值。当用于通用或一般情况(例如模板情况)时,此表单可能会达到所需的平衡(即引用、拷贝、prvalue/xvalue 返回(例如代理对象)等)。

倾向于一般的 auto&&,但如果您必须具体说明表单,请使用更具体的变体(例如 autoauto const&等)。

为什么 auto&& 更好?

正如此处其他答案和评论中所述。为什么 auto&& 更好?简单地说,它会做你认为在大多数情况下应该做的事情,见 this proposalits update .

一如既往,Scott Meyers 的 blog关于这一点也值得一读。

关于c++ - 强制 auto 成为循环范围内的引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25158976/

相关文章:

c - 如何在 C 中使用循环打印 n 个 *?

c++ - 如何访问多个级别的重写元素?

c++ - 从基类指针获取派生成员

c++ - 将reinterpret_cast 指针传递为void *

python - 在 python 中返回 "for if in"语句

java - 如何从 for 循环内的文本字段获取多个值并将其接收到数组中

C++ 模板函数。错误 C2440 : 'return' : cannot convert from '_FwdIt1' to '_FwdIt1'

c++ - 从 IDirect3DSurface9 获取像素?

C++:如何对 scoped_ptr 进行单元测试?

c++ - bool vs void* 对同一个对象进行强制转换