在GCC 9中是否有C++20范围库?

45

最新发布的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.

我有什么遗漏吗?

而且ranges库会随着GCC 9系列的到来而到达吗?


8
完全不相关的小牢骚:为什么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
6
@Alexander: 嗯,不对,不可能是那样的。一个库不能扩展语言的语法。你可以轻松地编写 using std::view::filter,然后使用 filter 而无需限定符。事实上,建议这么做,因为完全限定的名称会禁用 Koenig查找。 - Ben Voigt
4
@Alexander:你的建议的主要问题在于,你提出了对语言的更改,而这只是一个新库。此外,绑定方法对于C++允许和经常使用的灵活性有相当大的限制,因此采用了重载运算符模型。此外,你仍然可以导入个别名称。 - user1084944
4个回答

36

我有什么遗漏吗?

没有。

ranges库会在gcc-9系列的某个时刻到达吗?

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


Ranges是一个庞大的库。现在是2019年,正式的C++20标准要等一年半才会发布。它需要一段时间才能被主要的标准库实现采纳。我们只能等待。

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

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


1
值得注意的是,范围(ranges)在很大程度上依赖于目前只存在于GCC中的TS概念。 - Morwenn

14

14

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

在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

在3月份,GCC 10已作为稳定版本发布(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 << ' ';
  }
}

*: 由于命名空间别名是std::views而不是std::view,因此需要进行小修复。

我在macOS上手动编译的本地安装中进行了测试。

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

你是如何在你的Mac上安装g++-10的? - Felix Jassler
我是“手动”完成的:为此,您可以阅读https://gcc.gnu.org/install/。 - Pascal H.
1
在我的情况下,我需要下载gcc源代码,然后执行以下命令: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。等待约30分钟,就可以使用了。 - Pascal H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接