【问题标题】:Satisfy std::ranges::range concept满足 std::ranges::range 概念
【发布时间】:2020-01-27 11:51:08
【问题描述】:

在即将到来的 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>);

我错过了什么?

【问题讨论】:

  • “仅展示”的含义显然是您所缺少的。这不是一个真正的定义。阅读链接页面的其余部分。

标签: c++ range c++-concepts


【解决方案1】:

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

名称ranges​::​begin 表示customization point object。这 表达式 ranges​::​​begin(E) 对于某些子表达式 E 是 表达式等价于:

  • [...]

  • 否则,如果E是左值,decay-copy(E.begin())如果是有效表达式及其类型I模型 input_­or_­output_­iterator.

  • [...]

对于您的AA.begin() 的类型为void,它不可能是迭代器。因此,ranges::begin(std::declval&lt;A&gt;()) 无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 2022-01-23
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2020-11-30
    相关资源
    最近更新 更多