【问题标题】:Do we have C++20 ranges library in GCC 9?我们在 GCC 9 中有 C++20 范围库吗?
【发布时间】:2019-09-30 19:16:47
【问题描述】:

我们在新发布的 GCC 9 中支持 C++20 范围库吗?

我从以下位置复制了以下范围库的示例代码: https://en.cppreference.com/w/cpp/ranges

#include <vector>
#include <ranges>
#include <iostream>

int main()
{
  std::vector<int> ints{0,1,2,3,4,5};
  auto even = [](int i){ return 0 == i % 2; };
  auto square = [](int i) { return i * i; };

  for (int i : ints | std::view::filter(even) | std::view::transform(square)) {
    std::cout << i << ' ';
  }
}

但是当使用 g++ 9.1 (Ubuntu 18.04 LTS (Bionic Beaver)) 编译时,它抱怨找不到&lt;ranges&gt;

$ g++ -std=c++2a cpp2a.cpp 
cpp2a.cpp:2:10: fatal error: ranges: No such file or directory
    2 | #include <ranges>
      |          ^~~~~~~~
compilation terminated.

我错过了什么吗?

范围库会在某个时间点与 GCC 9 系列一起出现吗?

【问题讨论】:

  • 完全不相关的小型咆哮:为什么 C++ 必须扼杀它选择采用的所有(否则很简单)特性的优雅?在 Ruby、Kotlin、Rust、Swift、Java 和 C# 之间,已经有很多优秀的 lambda 和 range 语法设计。这可能和(0...5).select { |x| x % 2 == 0 }.map { |x| x*x } 一样好。 std::adverb::There std::verb::are std::adjective::just std::adjective::too std::adjective::many std::noun::scopes.
  • @Alexander:不,不可能是这样的。库不能扩展语言的语法。现在,您可以轻松编写using std::view::filter,然后使用filter,而无需对其进行限定。事实上,建议这样做,因为完全限定名称会禁用 Koenig 查找。
  • @Alexander:反对您的建议的主要观点是您提议更改语言,而这只是一个新库。此外,绑定方法对 C++ 允许和 C++ 风格经常利用的灵活性有很大限制:因此是重载运算符模型。无论如何,您都可以导入个人姓名。

标签: c++ gcc c++20


【解决方案1】:

我错过了什么吗?

没有。

范围库会在某个时间点与 gcc-9 系列一起出现吗?

有可能,但似乎不太可能。这没有发生。在 gcc 中支持 Ranges 的第一个版本是 gcc 10.1。


Ranges 是一个巨大的 库。现在还是 2019 年,官方的 C++20 标准还要再过一年半才能发布。它需要一段时间才能在主要的标准库实现中实现。我们只需要等待。

如果您想开始使用 Ranges,可以使用 Range-v3(特别是 v1.0-beta 分支),或者您可以在 cmcstl2 找到 C++20 Ranges 的实现(这是 Casey Mysterious Carter 的实现)。

您还可以定期检查 cppreference 的 compiler/library tracking page(在撰写本文时,它显示没有库实现了 One Ranges 提案,但确实显示了许多 C++20 功能已由各个库供应商实现)。

【讨论】:

  • 还值得注意的是,范围严重依赖于目前仅存在于 GCC 中的 TS 化身中的概念。
【解决方案2】:

Table 1.7. C++ 2020 Implementation Status

One Ranges 提案 P0896R4

版本是 10.1。这意味着您需要至少升级到该版本才能获得该功能。

【讨论】:

    【解决方案3】:

    g++10 支持&lt;ranges&gt; 功能以及number of other c++20 features

    #include <vector>
    #include <ranges>
    #include <iostream>
    
    int main()
    {
      std::vector<int> ints{0,1,2,3,4,5};
      auto even = [](int i){ return 0 == i % 2; };
      auto square = [](int i) { return i * i; };
    
      for (int i : ints | std::views::filter(even) | std::views::transform(square)) {
        std::cout << i << ' ';
      }
    }
    
    $ g++-10 -Wall -Wextra -std=c++20 ranges.cpp 
    $ ./a.out 
    0 4 16
    

    在 Ubuntu 上,这些软件包现在可用。安装:

    sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    sudo apt-get update
    sudo apt install gcc-10 g++-10
    

    但是,g++-10 不支持所有 功能。有关支持的功能列表,请参阅 Table 1.8. C++ 2020 Library Features

    【讨论】:

      【解决方案4】:

      GCC 10 已于 3 月发布为稳定版(带有 version update 10.1 on May 7, 2020)。

      此版本支持ranges

      compiler/library tracking page 也是最新的。

      因此您的代码示例* 编译:https://godbolt.org/z/MPxBMs

      #include <vector>
      #include <ranges>
      #include <iostream>
      
      int main()
      {
        std::vector<int> ints{0,1,2,3,4,5,6};
        auto even = [](int i){ return 0 == i % 2; };
        auto square = [](int i) { return i * i; };
      
        for (int i : ints | std::views::filter(even) | std::views::transform(square)) {
          std::cout << i << ' ';
        }
      }
      

      *:有一个小修复,因为命名空间别名是 std::views 而不是 std::view

      我在 macOS 上使用手动编译的本地安装对此进行了测试。

      g++-10.1 -std=c++20 -Wall test.cpp
      

      【讨论】:

      • 您是如何在 Mac 上获得 g++-10 的?
      • 我是手工完成的:要这样做,您可以阅读gcc.gnu.org/install
      • 在我的例子中,它是:下载 gcc 源代码,然后 mkdir build &amp;&amp; cd build &amp;&amp; ../configure --prefix=your_install_path --enable-checking=release --enable-languages=c,c++ --disable-multilib --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk --program-suffix=-10.1 &amp;&amp; make install 。等待约 3000 万,它应该可以使用了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 2021-06-17
      • 2021-02-07
      • 2011-08-30
      • 2021-08-02
      • 2021-05-13
      相关资源
      最近更新 更多