Что делает CommonReference, используемый Readable в Range-v3?

я нашел это 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 удовлетворить их?

1

Решение

Ваша проблема в 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,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]