6

你有没有经历过用BOOST_FOREACH基于范围的for循环替换的过程?机械地做它时是否有任何陷阱(即没有对周围的代码进行深入研究)。

背景:我确实有大约 250K 行的源代码,使用 Microsoft VC++ 10 (Visual Studio 2010) 编译。该代码还使用来自 boost 库的 BOOST_FOREACH。我只是在尝试for使用auto.

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

BOOST_FOREACH (element, container) {
    ...
}

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

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

谢谢你的帮助,彼得

4

2 回答 2

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) ...
于 2012-08-24T15:21:07.460 回答
1

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

是的,但是如果类型是例如,int&那么我会将其替换为auto&否则推导的类型将不是参考。

于 2012-08-24T13:18:31.067 回答