К моему удивлению, это Концептуальное утверждение терпит неудачу в RangeV3.
#include<vector>
#include<range/v3/algorithm/copy.hpp>
int main(){
static_assert(ranges::WeaklyIncrementable<std::back_insert_iterator<std::vector<double> >>());
}
Почему это так?
Это, среди прочего, означает, что я не могу использовать алгоритм ranges::copy
, как я использую для std::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.
Это канонический путь к back_insert
в RangesV3?
Я не могу найти документацию WeaklyIncrementable в RangeV3, но в cppreference https://en.cppreference.com/w/cpp/experimental/ranges/iterator/WeaklyIncrementable кажется, что существует «другой тип со знаком», который, вероятно, не определен для back_inserter_iterator
. Это, вероятно, означает 1 или 3 вещи, а) RangeV3 чрезмерно ограничивает требования copy
б) copy
не является алгоритмом обратной вставки, в) Я понятия не имею, как использовать RangeV3.
Нашел https://github.com/ericniebler/range-v3/issues/867, возможный обходной путь, чтобы использовать range::back_inserter(v)
вместо std::back_inserter(v)
. Кажется, что где-то есть требование конструктивности по умолчанию.