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

时间:2012-08-22 10:16:11

标签: c++ visual-c++ boost 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) {
    ...
}

...并且element应该在break之后的循环中设置值。你能记得类似的问题吗?

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

感谢您的帮助,   彼得

2 个答案:

答案 0 :(得分:4)

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

示例:

std::vector<int> v;
for (int i: v) ...

如果v更改为std::vector<long>std::vector<unsigned>,则类型转换可能不受欢迎;仍然,编译器警告应该捕获这个(特别是对于缩小转换)。另一方面,您可以使用代码来进行(扩展)转换:

std::vector<char> v;
for (int i: v) ...

答案 1 :(得分:1)

  

你会选择用auto替换显式类型吗?

是的,但如果类型是例如int&然后我会将其替换为auto&,否则推断的类型将不会作为参考。