【发布时间】:2014-03-13 23:04:39
【问题描述】:
STL(person) 最近关于基于 for 循环的范围内隐式 auto&& 的提议让我想知道迭代和修改序列元素的正确方法是什么
for(auto&& elem: cont)
{
}
或
for(auto& elem: cont)
{
}
【问题讨论】:
-
右值引用是一个普通的引用也可以绑定到一个临时的。你看到的是临时的吗?
STL(person) 最近关于基于 for 循环的范围内隐式 auto&& 的提议让我想知道迭代和修改序列元素的正确方法是什么
for(auto&& elem: cont)
{
}
或
for(auto& elem: cont)
{
}
【问题讨论】:
没有所谓的“适当”;这取决于您要迭代的内容以及您想对每个迭代执行什么操作。
【讨论】:
两者是等价的;在第一种情况下,“引用折叠”意味着elem 的类型变成了一个左值 引用,因为它的初始化器是一个左值。我会说第二个更“恰当”,因为它表达了实际发生的事情。
(除非,正如重复的答案中所指出的那样,容器打破了容器要求,就像 std::vector<bool> 所做的那样,reference 类型实际上不是引用类型。在这种情况下,第一个将绑定 @ 987654327@ 到该类型的临时,而第二个不会编译。)
【讨论】:
std::vector<bool> 这样的不合格容器。