std::ranges::rend
定義於標頭檔案 <ranges> |
||
定義於標頭檔案 <iterator> |
||
inline namespace /* unspecified */ { inline constexpr /* unspecified */ rend = /* unspecified */; |
(C++20 起) (定製點物件) |
|
呼叫簽名 (Call signature) |
||
template< class T > requires /* 見下文 */ |
(C++20 起) | |
返回一個表示反向範圍末尾的哨兵。
如果 T
是陣列型別且 std::remove_all_extents_t<std::remove_reference_t<T>> 不完整,則對 ranges::rend
的呼叫格式錯誤,無需診斷。
如果引數是左值或 ranges::enable_borrowed_range<std::remove_cv_t<T>> 為 true,則對 ranges::rend
的呼叫 表示式等價 於
- decay-copy(t.rend())(C++23 前)auto(t.rend())(C++23 起),如果該表示式有效且其型別模型 std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))>。
- 否則,decay-copy(rend(t))(C++23 前)auto(rend(t))(C++23 起),如果
T
是類或列舉型別,該表示式有效且其型別模型 std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))>,其中rend
的含義如同僅執行實參依賴查詢所建立的。 - 否則,std::make_reverse_iterator(ranges::begin(t)),如果 ranges::begin(t) 和 ranges::end(t) 都是有效表示式,具有相同型別,且該型別模型 std::bidirectional_iterator。
在所有其他情況下,對 ranges::rend
的呼叫格式錯誤,當 ranges::rend(t) 出現在模板例項化的即時上下文中時,這可能導致替換失敗。
目錄 |
自定義點物件
名稱 ranges::rend
表示一個定製點物件,它是一個 字面量 semiregular
類型別的 const 函式物件。為便於說明,其型別的不帶 cv 限定版本表示為 __rend_fn
。
__rend_fn
的所有例項均相等。在相同引數上呼叫型別為 __rend_fn
的不同例項的效果是等價的,無論表示例項的表示式是左值還是右值,以及是否帶有 const 限定符(但是,不要求可呼叫帶有 volatile 限定符的例項)。因此,ranges::rend
可以自由複製,並且其副本可以互換使用。
給定一組型別 Args...
,如果 std::declval<Args>()... 滿足上述 ranges::rend
引數的要求,則 __rend_fn
模型
- std::invocable<__rend_fn, Args...>,
- std::invocable<const __rend_fn, Args...>,
- std::invocable<__rend_fn&, Args...>,以及
- std::invocable<const __rend_fn&, Args...>.
否則,__rend_fn
的任何函式呼叫運算子都不參與過載決議。
[編輯] 注意
如果引數是右值(即 T
是物件型別)且 ranges::enable_borrowed_range<std::remove_cv_t<T>> 為 false,或者如果它是一個未知邊界的陣列型別,則對 ranges::rend
的呼叫格式錯誤,這也導致替換失敗。
如果 ranges::rend(std::forward<T>(t)) 有效,則 decltype(ranges::rend(std::forward<T>(t))) 和 decltype(ranges::begin(std::forward<T>(t))) 在所有情況下都模型 std::sentinel_for,而 T
模型 std::ranges::range。
C++20 標準要求如果底層 rend
函式呼叫返回一個純右值,則返回值是從具象化臨時物件移動構造的。所有實現都直接返回純右值。該要求由 C++20 後提案 P0849R8 糾正,以匹配實現。
[編輯] 示例
#include <algorithm> #include <iostream> #include <ranges> #include <vector> int main() { std::vector<int> v = {3, 1, 4}; namespace ranges = std::ranges; if (ranges::find(ranges::rbegin(v), ranges::rend(v), 5) != ranges::rend(v)) std::cout << "found a 5 in vector v!\n"; int a[] = {5, 10, 15}; if (ranges::find(ranges::rbegin(a), ranges::rend(a), 5) != ranges::rend(a)) std::cout << "found a 5 in array a!\n"; }
輸出
found a 5 in array a!
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
P2602R2 | C++20 | 存在機制來禁止某些由 ADL 找到的非成員 rend |
刪除了此類機制 |
[編輯] 參閱
(C++20) |
返回只讀範圍的反向結束迭代器 (定製點物件) |
(C++20) |
返回指向範圍的反向迭代器 (定製點物件) |
(C++14) |
返回容器或陣列的反向結束迭代器 (函式模板) |