首页 > 解决方案 > 为什么我需要评估 range-v3 视图才能将它们与 concat 一起使用?

问题描述

我正在尝试在仅移动类型上连接多个视图:

using namespace ranges;
auto v = views::ints(0, 4) |
         views::transform([](int i) { return std::make_unique<int>(i); });
auto w = views::ints(4, 8) |
         views::transform([](int i) { return std::make_unique<int>(i); });
auto x = views::concat(v, w) | to<std::vector>();

但是,这不适合我编译,我无法理解错误消息(请参阅https://godbolt.org/z/TcoP8djnz)。

但是,如果我选择评估v并且w首先,代码会编译:

auto v = views::ints(0, 4) |
         views::transform([](int i) { return std::make_unique<int>(i); }) |
         to<std::vector>();
auto w = views::ints(4, 8) |
         views::transform([](int i) { return std::make_unique<int>(i); }) |
         to<std::vector>();
auto x = views::concat(v | views::move, w | views::move) | to<std::vector>();

这是为什么?根据range-v3 doxygen的要求是参数为concatsviewable_rangeinput_ranges。虽然我不确定我是否完全理解前一个概念的含义,但我认为即使在第一种情况下也应该满足这两个要求。

make_unique顺便说一句,当我替换为时,第一种情况也会编译make_shared,即我用可复制类型替换它。

标签: c++range-v3

解决方案


推荐阅读