【发布时间】:2012-04-17 04:43:52
【问题描述】:
This question 提到了 C++11 基于范围的 for 的明显惯用用法。
for (auto& elem: container) {
// do something with elem
}
不过,我一直怀疑您应该使用哪种参考。输入迭代器可能返回右值。虽然auto 引入的隐式类型可以推导出为const,它会绑定到一个右值,但这似乎不会发生。
使用完美转发的最佳一般做法是什么?
for (auto && elem: container) {
// do something with elem
}
我认为这里没有缺点,但它看起来有点太可爱了。也许我还没有写足够多的 C++11。
【问题讨论】:
-
对于无法享受基于范围的可怜的 MSVC10 用户,同样的问题适用于
BOOST_FOREACH。 -
auto永远不是const。你需要说auto const &。此外,auto &&不是右值引用,而是更多的“通用引用”。 -
@KerrekSB 很好的信息,
const没有在那里推断出来。我从来没有说过任何关于右值引用的事情;v) -
我应该补充一点,我的意思并不是“从不”:当然
const int a = 1; auto & ra = a;按预期工作。但是auto永远不会变得比它需要的更 const。 -
@KerrekSB 你能澄清一下吗?
const是在函数参数上下文中推导出来的,auto是根据它定义的,没有例外。这似乎工作正常:int const i = 5; auto &x = i;EDIT 哈哈,好吧 :v) 。好吧,在任何情况下,它都不会猜测应该将左值引用设为 const 以绑定到右值。
标签: c++ for-loop c++11 perfect-forwarding