GCC 的 <experimental/ranges> 过滤器视图无法使用无限范围 iota() 进行编译
GCC's <experimental/ranges> filter view does not compile with infinite range iota()
我正在探索 gcc 中的实验范围库实现。
将无限 iota 范围与过滤器视图组合时,
我得到了一个令人惊讶的编译错误
(live example 使用 GCC 9.0 HEAD 201812):
#include <iostream>
#include <vector>
#include <experimental/ranges/range>
int main()
{
using namespace std::experimental::ranges;
auto odds = view::filter([](int x){ return x%2 != 0; });
// auto v = std::vector{0,1,2,3,4,5};
// auto x = v | odds; // (1) ok
// auto x = view::iota(0,6) | odds; // (2) ok
// auto x = view::iota(0) | view::take(6); // (3) ok
auto x = view::iota(0) | view::take(6) | odds; // (4) error: sentinel?
for (auto e : x) std::cout << e << ' ';
}
这里有什么问题?
这只是 cmcstl2 中的一个错误。较短的复制示例:
auto yes = [](int){ return true; };
// this works
view::filter(view::iota(0), yes);
view::iota(0,10) | view::filter(yes);
// this doesn't
view::iota(0) | view::filter(yes);
Casey 已经在 this PR (specifically this commit) 中修复了它。
我正在探索 gcc 中的实验范围库实现。 将无限 iota 范围与过滤器视图组合时, 我得到了一个令人惊讶的编译错误 (live example 使用 GCC 9.0 HEAD 201812):
#include <iostream>
#include <vector>
#include <experimental/ranges/range>
int main()
{
using namespace std::experimental::ranges;
auto odds = view::filter([](int x){ return x%2 != 0; });
// auto v = std::vector{0,1,2,3,4,5};
// auto x = v | odds; // (1) ok
// auto x = view::iota(0,6) | odds; // (2) ok
// auto x = view::iota(0) | view::take(6); // (3) ok
auto x = view::iota(0) | view::take(6) | odds; // (4) error: sentinel?
for (auto e : x) std::cout << e << ' ';
}
这里有什么问题?
这只是 cmcstl2 中的一个错误。较短的复制示例:
auto yes = [](int){ return true; };
// this works
view::filter(view::iota(0), yes);
view::iota(0,10) | view::filter(yes);
// this doesn't
view::iota(0) | view::filter(yes);
Casey 已经在 this PR (specifically this commit) 中修复了它。