c++ - 满足 std::ranges::range 概念

标签 c++ range c++-concepts

在即将推出的 C++20 系列中,将有 range concept具有以下定义:

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 进行调用。

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

namespace ranges = std::experimental::ranges;

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

static_assert(ranges::range<A>);

我错过了什么?

最佳答案

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

The name ranges​::​begin denotes a customization point object. The expression ranges​::​​begin(E) for some subexpression E is expression-equivalent to:

  • [...]

  • Otherwise, if E is an lvalue, decay-copy(E.begin()) if it is a valid expression and its type I models input_­or_­output_­iterator.

  • [...]

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

关于c++ - 满足 std::ranges::range 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58129698/

相关文章:

c++ - 从 C++ 循环写入 .mat 文件

c++ - 如何在预处理器 (#if) 中转换 static const 以避免溢出

MYSQL - 限制在一个范围内

c++ - 如何在UML类图中绘制C++概念?

c++ - 如何对带有约束的模板类使用友元声明

c++ - 以 std::map<char*, int> mymap 的顺序在 map 中存储字符指针。将其存储为字符或字符串不是一种选择

java - 用于处理范围列表的库

c - 从大范围的数字中删除数字

c++ - 如何定义一个概念来检查类是否可以具有不同类型的模板参数

c++ - 大型矩阵上的 cblas_dgemm 段错误