簡體   English   中英

滿足 std::ranges::range 概念

[英]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())

  • [...]

對於您的AA.begin()的類型為void ,它不可能是迭代器。 因此, ranges::begin(std::declval<A>())是無效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM