名稱空間
變體
操作

std::ranges::end

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

    inline constexpr /* 未指定 */ end = /* 未指定 */;

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

    requires /* 見下文 */

constexpr std::sentinel_for<ranges::iterator_t<T>> auto end( T&& t );
(C++20 起)

返回指示範圍末尾的哨兵。

range-begin-end.svg

如果引數是左值,或者 ranges::enable_borrowed_range<std::remove_cv_t<T>>true,則對 ranges::end 的呼叫與以下表達式等價:

  1. t + std::extent_v<T> 如果 t 具有已知邊界的陣列型別。
  2. 否則,decay-copy(t.end())(C++23前)auto(t.end())(C++23起),如果該表示式有效,並且其型別符合 std::sentinel_for<ranges::iterator_t<T>>
  3. 否則,decay-copy(end(t))(C++23前)auto(end(t))(C++23起),如果 T 是類型別或列舉型別,該表示式有效且其轉換型別符合 std::sentinel_for<ranges::iterator_t<T>>,其中 end 的含義透過僅執行實參依賴查詢來確定。

在所有其他情況下,對 ranges::end 的呼叫格式不正確,當對 ranges::end 的調用出現在模板例項化的直接上下文中時,這可能導致替換失敗

目錄

自定義點物件

名稱 ranges::end 表示一個自定義點物件,它是一個 const 函式物件,其型別為字面量 semiregular 類型別。為便於說明,其型別的不帶 cv 限定符的版本表示為 __end_fn

所有 __end_fn 例項都相等。在相同引數上呼叫不同 __end_fn 型別的例項的效果是等價的,無論表示例項的表示式是左值還是右值,以及是否是 const 限定的(但是,volatile 限定的例項不要求可呼叫)。因此,ranges::end 可以自由複製,並且其副本可以互換使用。

給定一組型別 Args...,如果 std::declval<Args>()... 滿足上述 ranges::end 引數的要求,則 __end_fn 建模

否則,__end_fn 的函式呼叫運算子不參與過載決議。

[編輯] 注意

如果引數是右值(即 T 是物件型別),並且 ranges::enable_borrowed_range<std::remove_cv_t<T>>false,或者如果它是一個未知邊界的陣列型別,則對 ranges::end 的呼叫格式不正確,這也導致替換失敗。

如果 ranges::end(std::forward<T>(t)) 有效,則 decltype(ranges::end(std::forward<T>(t)))decltype(ranges::begin(std::forward<T>(t))) 在所有情況下都建模 std::sentinel_for,而 T 建模 std::ranges::range

C++20 標準要求如果底層 end 函式呼叫返回一個 prvalue,則返回值從具象的臨時物件移動構造。所有實現都直接返回 prvalue。該要求已由 C++20 後的提案 P0849R8 修正,以與實現保持一致。

[編輯] 示例

#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>
 
int main()
{
    std::vector<int> vec{3, 1, 4};
    if (std::ranges::find(vec, 5) != std::ranges::end(vec))
        std::cout << "found a 5 in vector vec!\n";
 
    int arr[]{5, 10, 15};
    if (std::ranges::find(arr, 5) != std::ranges::end(arr))
        std::cout << "found a 5 in array arr!\n";
}

輸出

found a 5 in array arr!

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
P2602R2 C++20 存在禁止某些透過 ADL 找到的非成員 end 的機制 移除了此類機制

[編輯] 參閱

返回一個表示只讀範圍末尾的哨兵
(自定義點物件)[編輯]
返回指向範圍開頭的迭代器
(自定義點物件)[編輯]
(C++11)(C++14)
返回指向容器或陣列末尾的迭代器
(函式模板) [編輯]