【问题标题】:Is for each statement legal in C++11对于 C++11 中的每个语句是否合法
【发布时间】:2014-07-17 10:05:27
【问题描述】:

在 Visual Studio 2013 中,以下语句是合法的。我在 cppreference.com 上找不到它。这是 C++11 标准吗?有人可以链接参考吗?

vector<string> items = { "aaa", "bbb", "ccc", "ddd" };
for each (string item in items)  
{
    cout << item << endl;
}

我只知道这个在C++11是合法的。

for (auto& item: items) {}

【问题讨论】:

标签: c++11 for-loop visual-studio-2013 range


【解决方案1】:

来自MSDN

遍历数组或集合。此非标准关键字在 C++/CLI 和本机 C++ 项目中都可用。但是,不建议使用它。考虑改用标准的基于范围的 for 语句 (C++)。

【讨论】:

    【解决方案2】:

    g++-4.10 和 clang-3.4 都支持(使用 -std=c++1z)一个简化的语句范围:

    for (item: items) {}
    

    这相当于:

    for (auto&& item: items) {}
    

    对于 const 项目范围,右值引用将折叠到 const auto&amp;。 此功能的设计实际上参考了每个语句的 C++/CLI 作为实现经验。

    由于为 std C++ 设计 this feature 的人为 Microsoft 工作,我强烈怀疑 Visual Studio 可能或很快就会拥有此功能。

    来自论文:

    实际存在实施经验来指导这一决定。 Visual C++ 为每个 (Elem elem in range)"。除了比 C++11 的 range-for 语法(允许 ADL 自定义), “for each”的实现增加了难以理解的常量 原因,所以“for each (Elem& elem in range)”不能用来修改 元素就地。这种限制一再让用户感到困惑,因为 在 Microsoft 的内部邮件列表中遇到过。

    【讨论】:

    • 我认为您的意思是-std=c++0x,但无论如何他现在应该使用-std=c++11。此外,GCC 和 Clang 支持 基于范围的 for 循环 已经有一段时间了(使用 -std=c++0x 标志)。自 2012 版以来,Visual Studio 增加了对它们的支持。
    • @MihaiTodor 我知道 -std=c++11 - 它会为您提供范围循环,但您仍然必须提供 auto&& 或其他内容。大多数编译器都有 -std=c++14(可能是 -std=c++1y),最近甚至 -std=c++1z 用于计划的 C++17。我是说许多编译器开始实现 C++17 计划的东西 - 其中之一是简洁的 for 循环范围,部分灵感来自 for each。
    • 啊,是的,对不起。请忽略我的评论。我没有意识到有计划进一步简化基于范围的 for 循环,所以我完全误读了你的答案......
    猜你喜欢
    • 2021-05-13
    • 2011-12-01
    • 1970-01-01
    • 2013-09-04
    • 2010-10-04
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2017-01-22
    相关资源
    最近更新 更多