满足 std::ranges::range 概念

Vin*_*nci 5 c++ range c++-concepts

在即将到来的 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>;
Run Code Online (Sandbox Code Playgroud)

将其翻译成简单的英语,我会说,满足范围概念的类型的唯一要求是可以使用 range::begin 和 Ranges::end 进行调用。

但是,如果我创建一个空类型,只开始和结束范围概念的静态断言失败?

namespace ranges = std::experimental::ranges;

struct A {
  void begin() {}
  void end() {}
};

static_assert(ranges::range<A>);
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

L. *_* F. 5

Per [range.access.begin] : (强调我的)

该名称ranges?::?begin表示自定义点对象。表达ranges?::??begin(E)对某些子表达式E是表达式等效于:

  • [...]

  • 否则, ifE是一个左值,decay-copy(E.begin())如果它是一个有效的表达式并且它的类型为Imodels input_­or_­output_­iterator

  • [...]

您的A,A.begin()是类型void,它不可能是迭代器。因此,ranges::begin(std::declval<A>())无效。