【发布时间】:2019-10-27 12:58:54
【问题描述】:
令我惊讶的是,这个类似概念的断言在 RangeV3 中失败。
#include<vector>
#include<range/v3/algorithm/copy.hpp>
int main(){
static_assert(ranges::WeaklyIncrementable<std::back_insert_iterator<std::vector<double> >>());
}
这是为什么呢?
这意味着我不能像使用std::copy 那样使用ranges::copy 算法。
std::vector<double> w(100);
std::vector<double> v;
ranges::copy(
begin(w), end(w),
std:back_inserter(v)
); // compilation error, concept not fulfilled.
这是在 RangesV3 中 back_insert 的规范方式吗?
我在 RangeV3 中找不到 WeaklyIncrementable 文档,但在 cppreference https://en.cppreference.com/w/cpp/experimental/ranges/iterator/WeaklyIncrementable 中似乎有一个“签名的不同类型”可能没有为 back_inserter_iterator 定义。这可能意味着 1 或 3 件事,a) RangeV3 过度约束 copy 要求 b) copy 不是反向插入的算法,c) 我不知道如何使用 RangeV3。
找到这个https://github.com/ericniebler/range-v3/issues/867,一个可能的解决方法是使用range::back_inserter(v) 而不是std::back_inserter(v)。似乎某处有默认的可构造性要求。
【问题讨论】:
标签: c++11 insert iterator c++-concepts range-v3