gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:09:52 33 4
gpt4 key购买 nike

在即将推出的 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com