c++ - 在 range v3 库中,为什么 ranges::copy 不适用于 ranges::views::chunk 的输出?

标签 c++ c++20 range-v3

这按预期工作:

#include <range/v3/all.hpp>
#include <iostream>

int main() {
  auto chunklist = ranges::views::ints(1, 13) | ranges::views::chunk(4);
  for (auto rng : chunklist) {
    for (auto elt : rng)
      std::cout << elt << " ";    
    std::cout << std::endl;
  }
}

在屏幕上:

1 2 3 4
5 6 7 8
9 10 11 12

但是如果我尝试用 ranges::copy 代替 for 循环,我会遇到编译错误

  auto chunklist = ranges::views::ints(1, 13) | ranges::views::chunk(4);
  for (auto rng : chunklist) {
    ranges::copy(rng, std::ostream_iterator<int>{std::cout, " "}); // FAIL
    std::cout << std::endl;
  }

编译错误相当模糊。我不会在这里给出全文,但看起来几乎所有概念都失败了:

note:   constraints not satisfied
...
note: within '...' CPP_concept_bool weakly_incrementable =
...
note: within '...' CPP_concept_bool semiregular =
...
note: within '...' CPP_concept_bool default_constructible =
...
note: within '...' CPP_concept_bool constructible_from =
...
confused by earlier errors, bailing out

我正在使用带选项的 gcc-9.3:

g++ -fconcepts --std=c++2a chunksimplified.cc

来自 github 的 trunk range-v3 库的顶部

我应该如何修改代码以使用显式算法而不是原始循环?

最佳答案

问题不在于 ranges::copy,只是 ranges::views 不能很好地与 std::ostream_iterator

您可以只使用 ranges::ostream_iterator 代替:

ranges::copy(rng, ranges::ostream_iterator<int>{std::cout, " "});  

这是一个有效的 demo .

关于c++ - 在 range v3 库中,为什么 ranges::copy 不适用于 ranges::views::chunk 的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61706169/

相关文章:

具有多个指针初始值设定项的 C++ for 循环

c++ - 改变音量 win32 c++

c++ - 大括号初始化时 GCC 出现编译错误

c++ - Boost asio http截止日期错误?

c++ - 在我的类 C++ 中创建一个对象

c++ - span 是否传播 const?

c++ - 使用 std::shared_ptr 时的内存新删除类型不匹配

c++ - Range-v3 View 组合和 View 计算并行化

c++ - 通过按索引选择范围的元素来创建 View

c++ - 算法能否与表达式模板兼容?