我发现.Value
在范围-v3中不满足.Range("A" & x & ":Y" & x).Value = .Range("A" & x & ":Y" & x).Value
概念。在查看了这个概念之后,我发现了这个约束:
typename gsl::span<const gsl::byte>::const_iterator
Readable
从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
会满足他们?
答案 0 :(得分: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
- 合格的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
的指针也是如此。