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

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

提问人:thor 提问时间:5/14/2019 最后编辑:Peter Mortensenthor 更新时间:4/10/2021 访问量:26355

问:

我们是否在新发布的 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 系列的某个时间点到达吗?

C++ GCC C++20

评论

8赞 Alexander 5/14/2019
完全不相关的迷你咆哮:为什么C++必须扼杀它选择采用的所有(原本简单的)功能的优雅?在 Ruby、Kotlin、Rust、Swift、Java 和 C# 之间,已经有很多关于 lambda 和范围语法的优秀设计。这本来可以像.(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.
6赞 Ben Voigt 5/14/2019
@Alexander:嗯,不,不可能是那样的。库不能扩展语言的语法。现在,您可以轻松编写然后使用,而无需对其进行限定。事实上,建议这样做,因为完全限定的名称会禁用 Koenig 查找。using std::view::filterfilter
4赞 5/14/2019
@Alexander:反对你的建议的主要观点是,你提议对语言进行更改,而这只是一个新库。此外,绑定方法对 C++ 允许和 C++ 风格经常利用的灵活性相当有限:因此重载运算符模型。无论如何,您都可以导入单个名称。

答:

36赞 Barry 5/14/2019 #1

我错过了什么吗?

不。

范围库会在 gcc-9 系列的某个时间点到达吗?

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


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

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

您还可以定期查看 cpppreference 的编译器/库跟踪页面(在撰写本文时,该页面显示没有库实现了 One Ranges 提案,但仍然显示了相当多的 C++20 功能已由各种库供应商实现)。

评论

1赞 Morwenn 5/17/2019
还值得注意的是,范围严重依赖于目前仅存在于 GCC 中的 TS 化身中的概念。
14赞 NathanOliver 5/14/2019 #2

根据表 1.7.C++ 2020 实施状态

One Ranges 提案P0896R4

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

14赞 P.P 5/15/2020 #3

G++10 支持功能以及许多其他 C++20 功能<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::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 并不支持所有功能。请参阅表 1.8。C++ 2020 库功能 支持的功能列表。

5赞 Pascal H. 5/15/2020 #4

GCC 10 已于 3 月稳定发布(版本更新为 10.1,将于 2020 年 5 月 7 日发布)。

此版本支持 .ranges

编译器/库跟踪页面也是最新的。

因此,您的代码示例*将编译: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::viewsstd::view

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

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

评论

0赞 Felix Jassler 6/16/2020
您如何在 Mac 上获得 g++-10?
0赞 Pascal H. 6/17/2020
我是手工完成的:为此,您可以阅读 gcc.gnu.org/install .
1赞 Pascal H. 6/17/2020
就我而言,它是:下载 gcc 源代码,然后.等待 ~30mn,它应该可以使用了。mkdir build && cd build && ../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 && make install