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

标签 c++ visual-c++ boost c++11

您是否经历过将 BOOST_FOREACH 替换为基于范围的 for 循环的过程? 机械地(即没有对周围的代码进行深入研究)时是否有任何问题?

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

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

BOOST_FOREACH (element, container) {
    ...
}

... 并且 元素 应该在 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/

相关文章:

c++ - MSDN Windows App 教程问题

c# - 在调用 c++ 代码时出现访问冲突错误是 c#

c++ - 从 C++ 调用 powershell cmdlet

c++ - IXMLDOMDocument::selectNodes 无法按预期工作

c++ - 使用柯南包管理器 boost 链接错误

c++ - 将工作空间(WINCE设备com)转换为兼容PC的工作空间

c++ - 在类模板的成员枚举上重载运算符

java - 执行在 "Microsoft Visual C++ Runtime Error"-popup 时停止

c++ - 在 boost::mapped_region 上刷新是多余的吗?

c++ - 为什么const对不是boost_is_pair?