新发布的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功能)。
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 库功能。
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)
归档时间: |
|
查看次数: |
2523 次 |
最近记录: |