您是否曾经经历过使用基于范围的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/

10-11 23:00