假设我有 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&&
,但如果您必须具体说明表单,请使用更具体的变体(例如 auto
、auto const&
等)。
为什么 auto&&
更好?
正如此处其他答案和评论中所述。为什么 auto&&
更好?简单地说,它会做你认为在大多数情况下应该做的事情,见 this proposal和 its update .
一如既往,Scott Meyers 的 blog关于这一点也值得一读。
关于c++ - 强制 auto 成为循环范围内的引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25158976/