我能看到的唯一优势是当序列迭代器返回一个代理引用并且您需要以非常量方式对该引用进行操作时。例如考虑:
#include <vector>
int main()
{
std::vector<bool> v(10);
for (auto& e : v)
e = true;
}
这不会编译,因为vector<bool>::reference
从返回的右值iterator
不会绑定到非常量左值引用。但这会起作用:
#include <vector>
int main()
{
std::vector<bool> v(10);
for (auto&& e : v)
e = true;
}
话虽如此,除非你知道你需要满足这样的用例,否则我不会这样编码。即我不会无缘无故地这样做,因为它确实会让人们想知道你在做什么。如果我确实这样做了,那么包含一个关于原因的评论也没有什么坏处:
#include <vector>
int main()
{
std::vector<bool> v(10);
// using auto&& so that I can handle the rvalue reference
// returned for the vector<bool> case
for (auto&& e : v)
e = true;
}
编辑
我的最后一个案例应该是一个有意义的模板。如果你知道循环总是在处理一个代理引用,那么auto
它会和auto&&
. 但是,当循环有时处理非代理引用,有时处理代理引用时,我认为auto&&
将成为首选解决方案。