您是否经历过基于范围的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
而不是在那里留下明确的声明,那么这样做有什么好处吗?
感谢您的帮助, 彼得
答案 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&
,否则推断的类型将不会作为参考。