39

在使用基于范围的循环进行编程时假设我当前的规则说

尽可能使用for(auto const &e :...)for(auto &e:...)结束for(auto a: ...)

我基于我自己的经验和这个问题,例如。

但是在阅读了新的简洁 for 循环&之后,我想知道,我不应该在我的规则中用替换我的&&吗?正如这里所写,这看起来像Meyers 的 Universal References

所以,我问自己,我的新规则是否应该是

使用for(auto const &&e :...)for(auto &&e:...)尽可能...

或者这并不总是有效,因此应该是相当复杂的

检查for(auto const &&e :...)orfor(auto &&e:...)是否可能,然后考虑for(auto const &e :...)or for(auto &e:...),并且仅在需要时才不要使用引用。

4

1 回答 1

11

Howard Hinnant在这里auto&&很好地解释了何时以及是否应该使用for 循环。

x这就留下了一个问题

auto &&x = ...expr...

实际上是。它的处理就像有一个函数模板定义一样

template <class U> void f(const U& u);

的类型由与[§7.1.6.4.(7)]x相同的规则推导出来。u

这意味着它不是作为 RValue 引用处理,而是作为“通用/转发引用”——“引用折叠规则”适用。

这也适用于

const auto &&x = ...expr...

如 §7.1.6.4.(7) 中的示例所述,至少对于const auto &x.

但是,正如 PiotrS 在问题评论中所说,任何限定词都会使 URef 无效:

不,因为Tin既不template<class T> void f(const T&&)是转发引用,也不const auto&&是。参数声明中发生的事实T&&并不意味着它是转发引用。只有 pureT&&没有限定符 like constorvolatile是转发引用,这意味着它必须是template<class T> void f(T&&)or auto&&,并且从不const T&&orconst auto&&

于 2014-11-19T08:41:54.437 回答