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)
我错过了什么?
Per [range.access.begin] : (强调我的)
该名称
ranges?::?begin表示自定义点对象。表达ranges?::??begin(E)对某些子表达式E是表达式等效于:
[...]
否则, if
E是一个左值,decay-copy(E.begin())如果它是一个有效的表达式并且它的类型为Imodelsinput_or_output_iterator。[...]
您的A,A.begin()是类型void,它不可能是迭代器。因此,ranges::begin(std::declval<A>())无效。
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |