名稱空間
變體
操作

std::ranges::rend

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
定義於標頭檔案 <ranges>
定義於標頭檔案 <iterator>
inline namespace /* unspecified */ {

    inline constexpr /* unspecified */ rend = /* unspecified */;

}
(C++20 起)
(定製點物件)
呼叫簽名 (Call signature)
template< class T >

    requires /* 見下文 */
constexpr std::sentinel_for<

    decltype(ranges::rbegin(std::declval<T>()))> auto rend( T&& t );
(C++20 起)

返回一個表示反向範圍末尾的哨兵。

range-rbegin-rend.svg

如果 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 的呼叫 表示式等價

  1. decay-copy(t.rend())(C++23 前)auto(t.rend())(C++23 起),如果該表示式有效且其型別模型 std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))>
  2. 否則,decay-copy(rend(t))(C++23 前)auto(rend(t))(C++23 起),如果 T 是類或列舉型別,該表示式有效且其型別模型 std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))>,其中 rend 的含義如同僅執行實參依賴查詢所建立的。
  3. 否則,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 模型

否則,__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++14)
返回容器或陣列的反向結束迭代器
(函式模板) [編輯]