c++ - 满足 std::ranges::range 概念
问题描述
在即将到来的 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 调用。
但是,如果我创建一个空类型,只是开始和结束范围概念上的静态断言会失败吗?
namespace ranges = std::experimental::ranges;
struct A {
void begin() {}
void end() {}
};
static_assert(ranges::range<A>);
我错过了什么?
解决方案
每[range.access.begin]:(强调我的)
该名称
ranges::begin
表示自定义点对象。ranges::begin(E)
某些子表达式的E
表达式等价于:
[...]
否则,如果
E
是一个左值,decay-copy(E.begin())
如果它是一个有效的表达式和它的类型I
模型input_or_output_iterator
。[...]
你的A
,A.begin()
是 type void
,它不可能是一个迭代器。因此,ranges::begin(std::declval<A>())
无效。
推荐阅读
- javascript - 子事件发生时如何获取当前元素?
- excel - 根据 MS Office 文档,DATEVALUE 不接受一种类型的参数
- javascript - 如何在 Codemirror 中删除新行上的缩进
- dart - ListView.builder 在颤动中逐项滚动
- sql - 根据另一个表中的数据,仅获取每个客户端 ID 的每个非唯一列的前 1 个
- angular - Angular 6:页面离开时的简单确认
- regex - 如何使用 RegEx 删除 Mat-Input 中的空白和特殊字符
- javascript - 使用 asnyc 管道检索数据的 HTML 中的 Angular 6 问题
- java - 参数索引超出范围(1 > 参数个数,即 0)。如何解决?
- python - “ValueError:没有足够的值来解包(预期 3,得到 1)”来自 str.split() 的错误