【问题标题】:GCC's <experimental/ranges> filter view does not compile with infinite range iota()GCC 的 <experimental/ranges> 过滤器视图不能用无限范围 iota() 编译
【发布时间】:2019-05-23 19:36:25
【问题描述】:

我正在探索 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 << ' ';
}

这里有什么问题?

【问题讨论】:

标签: c++ gcc c++20


【解决方案1】:

这只是 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(特别是 this commit)中修复了它。

【讨论】:

    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2020-06-13
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多