有没有从C++ 11中用基于范围的for循环替换BOOST_FOREACH的经验?

pep*_*epr 6 c++ boost visual-c++ c++11

你有没有经历过BOOST_FOREACH基于范围的for循环取代?机械地做这件事时是否有任何问题(即没有深入研究周围的代码).

背景:我有大约250K行的源代码,使用Microsoft VC++ 10(Visual Studio 2010)编译.该代码还使用了boost库中的BOOST_FOREACH.我只是尝试VC++ 11(Visual Studio 2012 RC),它也实现了基于范围的for循环auto.

到目前为止,我遇到了元素BOOST_FOREACH在括号外声明的情况(括号中没有声明):

BOOST_FOREACH (element, container) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

...并且element预计将在循环之后设置值break.你能记得类似的问题吗?

BOOST_FOREACH包含声明时,您会选择替换显式类型auto吗?如果只是机械地重写BOOST_FOREACH而不是在那里留下明确的声明,那么这样做有什么好处吗?

谢谢你的帮助,彼得

eca*_*mur 4

相对于使用实际类型或引用类型的优点auto是,如果容器类型发生更改,代码将继续工作。如果您有意对间接容器迭代器的结果执行类型转换,这可能不是您想要的。

例子:

std::vector<int> v;
for (int i: v) ...
Run Code Online (Sandbox Code Playgroud)

如果v更改为std::vector<long>std::vector<unsigned>那么类型转换可能是不需要的;尽管如此,编译器警告应该捕获这一点(特别是对于缩小转换)。另一方面,您可以使用旨在进行(扩大)转换的代码:

std::vector<char> v;
for (int i: v) ...
Run Code Online (Sandbox Code Playgroud)