GCC 9 中有 C++20 范围库吗?

Do we have C++20 ranges library in GCC 9?

我们在新发布的 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)) 编译时,它抱怨找不到 <ranges>:

$ 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 系列一起出现吗?

Am I missing something?

没有

And will the ranges library arrive at some point of time with the gcc-9 series?

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


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

如果您想开始使用 Ranges,可以使用 Range-v3 (specifically the v1.0-beta branch) or you can find an implementation of C++20 Ranges at cmcstl2(这是 Casey Mysterious Carter 的实现)。

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

Table 1.7. C++ 2020 Implementation Status

The One Ranges Proposal P0896R4

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

g++10 支持 <ranges> 功能以及 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

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