您是否曾经经历过使用基于范围的BOOST_FOREACH
循环替换for
的过程?机械地进行操作时是否有任何陷阱(即,不对周围的代码进行深入研究)。
背景:我确实有使用Microsoft VC++ 10(Visual Studio 2010)编译的约25万行的源。该代码还使用了boost库中的BOOST_FOREACH。我只是在尝试VC++ 11(Visual Studio 2012 RC),它也使用for
实现了基于范围的auto
循环。
到目前为止,我遇到了在BOOST_FOREACH
之外声明元素的情况(括号中没有声明):
BOOST_FOREACH (element, container) {
...
}
...,并且
element
的值应在break
之后的循环中设置。你还记得类似的问题吗?当
BOOST_FOREACH
包含声明时,您是否选择用auto
替换显式类型?当人们只是机械地重写BOOST_FOREACH
而不是在其中保留显式声明时,这样做有什么好处吗?谢谢你的帮助,
彼得
最佳答案
与使用实际类型或引用类型相比,auto
的优势在于,如果容器类型发生更改,则代码将继续工作。如果您有意对间接访问容器迭代器的结果执行类型转换,则可能不是您想要的。
例子:
std::vector<int> v;
for (int i: v) ...
如果
v
更改为std::vector<long>
或std::vector<unsigned>
,则可能不需要类型转换;尽管如此,编译器警告仍应捕获此错误(尤其是在转换范围缩小的情况下)。另一方面,您可能需要进行(扩大)转换的代码:std::vector<char> v;
for (int i: v) ...
关于c++ - 从C++ 11用基于范围的for循环替换BOOST_FOREACH的经验吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12070952/