std::ranges::range
來自 cppreference.com
定義於標頭檔案 <ranges> |
||
template< class T > concept range = requires( T& t ) { |
(C++20 起) | |
range
概念定義了一個型別,它透過提供一個迭代器和哨兵來表示範圍內的元素,從而允許迭代其元素。
目錄 |
[編輯] 語義要求
給定一個表示式 E,使得 decltype((E)) 是 T
,T
只有在以下情況下才符合 range
模型:
-
[
ranges::begin(E),
ranges::end(E))
表示一個 range,並且 - ranges::begin(E) 和 ranges::end(E) 都是攤銷常數時間,並且不以可觀察的方式改變 E 的值,以保持相等性表示式,並且
- 如果 ranges::begin(E) 的型別符合
forward_iterator
模型,則 ranges::begin(E) 保持 相等性(換句話說,前向迭代器支援多趟演算法)。
[編輯] 注意
一個典型的 range
類只需要提供兩個函式
- 一個成員函式
begin()
,其返回型別符合input_or_output_iterator
模型。 - 一個成員函式
end()
,其返回型別符合sentinel_for
<It>
模型,其中It
是begin()
的返回型別。
另外,它們也可以是非成員函式,透過引數依賴查詢找到。
[編輯] 示例
執行此程式碼
#include <ranges> // A minimum range struct SimpleRange { int* begin(); int* end(); }; static_assert(std::ranges::range<SimpleRange>); // Not a range: no begin/end struct NotRange { int t {}; }; static_assert(!std::ranges::range<NotRange>); // Not a range: begin does not return an input_or_output_iterator struct NotRange2 { void* begin(); int* end(); }; static_assert(!std::ranges::range<NotRange2>); int main() {}
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3915 | C++20 | ranges::begin(t) 和 ranges::end(t) 不需要隱式表示式變體 |
移除了冗餘要求 冗餘描述 |