【发布时间】:2019-09-30 19:16:47
【问题描述】:
我们在新发布的 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 系列一起出现吗?
【问题讨论】:
-
完全不相关的小型咆哮:为什么 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:不,不可能是这样的。库不能扩展语言的语法。现在,您可以轻松编写
using std::view::filter,然后使用filter,而无需对其进行限定。事实上,建议这样做,因为完全限定名称会禁用 Koenig 查找。 -
@Alexander:反对您的建议的主要观点是您提议更改语言,而这只是一个新库。此外,绑定方法对 C++ 允许和 C++ 风格经常利用的灵活性有很大限制:因此是重载运算符模型。无论如何,您都可以导入个人姓名。