提问人:thor 提问时间:5/14/2019 最后编辑:Peter Mortensenthor 更新时间:4/10/2021 访问量:26355
我们在 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 系列的某个时间点到达吗?
答:
我错过了什么吗?
不。
范围库会在 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 功能已由各种库供应商实现)。
评论
One Ranges 提案P0896R4
版本为 10.1。这意味着您至少需要升级到该版本才能获得该功能。
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 库功能 支持的功能列表。
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::views
std::view
我用在macOS上手工编译的本地安装对此进行了测试。
g++-10.1 -std=c++20 -Wall test.cpp
评论
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
评论
(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.
using std::view::filter
filter