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 系列一起出现吗?
Am I missing something?
没有
And will the ranges library arrive at some point of time with the gcc-9 series?
有可能,但似乎不太可能。这并没有发生。在 gcc 中支持范围的第一个版本是 gcc 10.1。
Ranges 是一个庞大的 库。现在还是 2019 年,官方 C++20 标准甚至还需要一年半的时间才能发布。它需要一段时间才能在主要的标准库实现中实现。我们只需要等待。
如果您想开始使用 Ranges,可以使用 Range-v3 (specifically the v1.0-beta
branch) or you can find an implementation of C++20 Ranges at cmcstl2(这是 Casey Mysterious Carter 的实现)。
您还可以定期检查 cppreference 的 compiler/library tracking page(在撰写本文时,它显示没有任何库实现了 One Ranges 提案,但确实显示了相当多的 C++20 功能已被实现各种图书馆供应商)。
每Table 1.7. C++ 2020 Implementation Status
The One Ranges Proposal P0896R4
版本是10.1。这意味着您至少需要升级到该版本才能获得该功能。
g++10 支持 <ranges>
功能以及 number of other c++20 features.
#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 不支持所有 功能。有关支持的功能列表,请参阅 Table 1.8. C++ 2020 Library Features。
GCC 10 已于 3 月稳定发布(带有 version update 10.1 on May 7, 2020)。
此版本支持ranges
.
compiler/library tracking page 也是最新的。
因此您的代码示例*编译: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
我们在新发布的 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 系列一起出现吗?
Am I missing something?
没有
And will the ranges library arrive at some point of time with the gcc-9 series?
有可能,但似乎不太可能。这并没有发生。在 gcc 中支持范围的第一个版本是 gcc 10.1。
Ranges 是一个庞大的 库。现在还是 2019 年,官方 C++20 标准甚至还需要一年半的时间才能发布。它需要一段时间才能在主要的标准库实现中实现。我们只需要等待。
如果您想开始使用 Ranges,可以使用 Range-v3 (specifically the v1.0-beta
branch) or you can find an implementation of C++20 Ranges at cmcstl2(这是 Casey Mysterious Carter 的实现)。
您还可以定期检查 cppreference 的 compiler/library tracking page(在撰写本文时,它显示没有任何库实现了 One Ranges 提案,但确实显示了相当多的 C++20 功能已被实现各种图书馆供应商)。
每Table 1.7. C++ 2020 Implementation Status
The One Ranges Proposal P0896R4
版本是10.1。这意味着您至少需要升级到该版本才能获得该功能。
g++10 支持 <ranges>
功能以及 number of other c++20 features.
#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 不支持所有 功能。有关支持的功能列表,请参阅 Table 1.8. C++ 2020 Library Features。
GCC 10 已于 3 月稳定发布(带有 version update 10.1 on May 7, 2020)。
此版本支持ranges
.
compiler/library tracking page 也是最新的。
因此您的代码示例*编译: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