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

tin*_*lyx 21 c++ gcc c++20

新发布的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 << ' ';
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当使用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.
Run Code Online (Sandbox Code Playgroud)

我想念什么吗?

范围库是否会在GCC 9系列的某个时间到达?

Bar*_*rry 18

我想念什么吗?

没有。

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

有可能,但似乎不太可能。


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

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

您还可以定期检查cppreference的编译器/库跟踪页面(毫不奇怪,当前没有显示任何库已实现One Ranges提议,但是确实显示了许多库供应商已实现的C ++ 20功能)。


Nat*_*ica 9

表1.7。C ++ 2020实施状态

一个范围建议P0896R4

未标记版本。这意味着它尚未在任何版本的GCC中实现。


P.P*_*.P. 9

g++10 支持<ranges>特性以及许多其他 c++20 特性

#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
Run Code Online (Sandbox Code Playgroud)

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

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt install gcc-10 g++-10
Run Code Online (Sandbox Code Playgroud)

但是,g++-10 并不支持所有功能。请参阅表1.8。支持功能列表的C++ 2020 库功能


Pas*_* H. 5

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

该版本支持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 << ' ';
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

g++-10.1 -std=c++20 -Wall test.cpp
Run Code Online (Sandbox Code Playgroud)