По-видимому, это как минимум несоответствие в range-v3
по сравнению с рабочим проектом TS Ranges.
Существует довольно скудное описание того, почему были добавлены эти предикаты same_as
. к к концепции readable
для итераторов в range-v3
выпуск 1449 .
Получить библиотеку диапазонов, компилируемую с msv c 19.24.28319 с / std : c ++ 17
...
- CPP_concept_fragment(readable_, (I),
+ CPP_concept_fragment(readable_,
+ requires (/*I const i*/) //
+ (
+ // { *i } -> same_as<iter_reference_t<I>>;
+ // { iter_move(i) } -> same_as<iter_rvalue_reference_t<I>>;
+ 0
+ ) &&
+ same_as<iter_reference_t<I const>, iter_reference_t<I>> &&
+ same_as<iter_rvalue_reference_t<I const>, iter_rvalue_reference_t<I>> &&
common_reference_with<iter_reference_t<I> &&, iter_value_t<I> &> &&
common_reference_with<iter_reference_t<I> &&,
iter_rvalue_reference_t<I> &&> &&
common_reference_with<iter_rvalue_reference_t<I> &&, iter_value_t<I> const &>
);
Кажется, что предикаты same_as
в реализации концепции предназначены для реализации требования:
// { *i } -> same_as<iter_reference_t<I>>;
// { iter_move(i) } -> same_as<iter_rvalue_reference_t<I>>;
Которые присутствовали (как комментарии в range/v3/iterator/concepts.hpp
) даже до этого изменения реализации.
Однако, на самом деле, ни одно из этих требований не присутствует в работающем черновик [iterators.readable] диапазонов TS (ни в текущий HEAD
ericniebler / stl2 , из которого генерируется предыдущий связанный черновик).
[iterators.readable] Концепция Readable
Концепция Readable удовлетворительная Типы, которые можно прочитать, применяя оператор *, включая указатели, умные указатели и итераторы.
template <class In>
concept bool Readable =
requires {
typename value_type_t<In>;
typename reference_t<In>;
typename rvalue_reference_t<In>;
} &&
CommonReference<reference_t<In>&&, value_type_t<In>&> &&
CommonReference<reference_t<In>&&, rvalue_reference_t<In>&&> &&
CommonReference<rvalue_reference_t<In>&&, const value_type_t<In>&>;
Может быть хорошей идеей сообщить об этом как о проблеме в По крайней мере, выясните, почему реализация range-v3
отличается от [iterators.readable]
в диапазонах TS.