я нашел это typename gsl::span<const gsl::byte>::const_iterator
не удовлетворяет Readable
концепция в диапазоне-v3. Посмотрев концепцию, я нашел это ограничение:
template<typename I>
auto requires_(I&&) -> decltype(
concepts::valid_expr(
// The value, reference and rvalue reference types are related
// through the CommonReference concept.
concepts::model_of<CommonReference, reference_t<I> &&, value_t<I> &>(),
concepts::model_of<CommonReference, reference_t<I> &&, rvalue_reference_t<I> &&>(),
concepts::model_of<CommonReference, rvalue_reference_t<I> &&, value_t<I> const &>(),
// Experimental additional tests. If nothing else, this is a good workout
// for the common_reference code.
concepts::model_of<Same, ranges::common_reference_t<reference_t<I>, value_t<I>>, value_t<I>>(),
concepts::model_of<Same, ranges::common_reference_t<rvalue_reference_t<I>, value_t<I>>, value_t<I>>()
));
ranges::common_reference_t
удаляет const
от value_type
и тогда они не одинаковы.
Что делать CommonReference
ограничения означают? Почему должен Readable
удовлетворить их?
Ваша проблема в GSL. Из источника для span_iterator
(https://github.com/Microsoft/GSL/blob/master/gsl/span#L145-L147):
using value_type =
std::conditional_t<IsConst, std::add_const_t<typename Span::element_type>,
typename Span::element_type>;
Так span::const_iterator
имеет const
-qualified value_type
, Это странно и неправильно. Это, вероятно, также не соответствует стандартам. Я еще не нашел окончательного доказательства в стандарте для этого утверждения, но стандарт весьма убедителен. Например, вот специализация std::iterator_traits
для указателей на const:
template<class T> struct iterator_traits<const T*> {
using difference_type = ptrdiff_t;
using value_type = T;
using pointer = const T*;
using reference = const T&;
using iterator_category = random_access_iterator_tag;
};
Увидеть? value_type
не является const
квалифицированным даже для указателей наconst
,
Других решений пока нет …