Range-v3中的Readable使用的CommonReference有什么作用?

时间:2016-12-07 10:12:25

标签: c++ range-v3

我发现.Value在范围-v3中不满足.Range("A" & x & ":Y" & x).Value = .Range("A" & x & ":Y" & x).Value 概念。在查看了这个概念之后,我发现了这个约束:

typename gsl::span<const gsl::byte>::const_iterator

Readabletemplate<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会满足他们?

1 个答案:

答案 0 :(得分:1)

您的问题出在GSL中。来自span_iteratorhttps://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 - 合格的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的指针也是如此。