![](/img/trans.png)
[英]Vectors do not satisfy std::ranges::contiguous_range in Eigen 3.4
[英]Satisfy std::ranges::range concept
在即將到來的 C++20 范圍中,將出現具有以下定義的范圍概念:
template< class T >
concept range = __RangeImpl<T&>; // exposition-only definition
template< class T >
concept __RangeImpl = requires(T&& t) {
ranges::begin(std::forward<T>(t)); // equality-preserving for forward iterators
ranges::end (std::forward<T>(t));
};
template< class T >
concept __ForwardingRange = ranges::range<T> && __RangeImpl<T>;
將其翻譯成簡單的英語我想說,滿足范圍概念的類型的唯一要求是可以使用 range::begin 和 range::end 調用。
但是,如果我創建一個空類型,只是開始和結束一個 static 對范圍概念的斷言會失敗嗎?
namespace ranges = std::experimental::ranges;
struct A {
void begin() {}
void end() {}
};
static_assert(ranges::range<A>);
我錯過了什么?
每[range.access.begin] :(強調我的)
名稱
ranges::begin
表示自定義點 object 。 某些子表達式E
的表達式ranges::begin(E)
等價於:
[...]
否則,如果
E
是一個左值,如果它是一個有效的表達式並且它的類型I
模型input_or_output_iterator
,則decay-copy(E.begin())
。[...]
對於您的A
, A.begin()
的類型為void
,它不可能是迭代器。 因此, ranges::begin(std::declval<A>())
是無效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.