在即将推出的 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 expressionranges::begin(E)
for some subexpressionE
is expression-equivalent to:
[...]
Otherwise, if
E
is an lvalue,decay-copy(E.begin())
if it is a valid expression and its typeI
modelsinput_or_output_iterator
.[...]
与您的A
, A.begin()
类型为void
,它不可能是迭代器。因此,ranges::begin(std::declval<A>())
无效。
关于c++ - 满足 std::ranges::range 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58129698/