名稱空間
變體
操作

std::ranges::begin

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

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

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

    requires /* 見下文 */

constexpr std::input_or_output_iterator auto begin( T&& t );
(C++20 起)

返回引數的第一個元素的迭代器。

range-begin-end.svg

如果引數是左值,或者 ranges::enable_borrowed_range<std::remove_cv_t<T>>true,則呼叫 ranges::begin 表示式等價於

  1. 如果 t 具有陣列型別,則為 t + 0
  2. 否則,decay-copy(t.begin())(C++23 前)auto(t.begin())(C++23 起),如果該表示式有效且其型別建模 std::input_or_output_iterator
  3. 否則,decay-copy(begin(t))(C++23 前)auto(begin(t))(C++23 起),如果 T 是類或列舉型別,且該表示式有效且其型別建模 std::input_or_output_iterator,其中 begin 的含義是透過僅執行實參依賴查詢來確定的。

在所有其他情況下,對 ranges::begin 的呼叫是 ill-formed,當調用出現在模板例項化的直接上下文中時,可能導致替換失敗

目錄

自定義點物件

名稱 ranges::begin 表示一個*自定義點物件*,它是一個常量函式物件,其型別為字面量semiregular類型別。為了便於說明,其 cv-unqualified 版本的型別表示為 __begin_fn

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

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

否則,__begin_fn 的任何函式呼叫運算子都不參與過載決議。

[編輯] 注意

如果引數是右值(即 T 是物件型別)並且 ranges::enable_borrowed_range<std::remove_cv_t<T>>false,則對 ranges::begin 的呼叫是 ill-formed,這也會導致替換失敗。

返回型別在所有情況下都建模 std::input_or_output_iterator

C++20 標準要求如果底層 begin 函式呼叫返回一個 prvalue,則返回值是從具體化的臨時物件移動構造的。所有實現都直接返回 prvalue。該要求已透過 C++20 後的提案 P0849R8 進行了更正,以與實現匹配。

[編輯] 示例

#include <cassert>
#include <ranges>
#include <vector>
 
int main() 
{
    std::vector v{3, 1, 4};
    auto vi = std::ranges::begin(v);
    auto vci = std::ranges::cbegin(v);
    assert(*vi == 3 and *vi == *vci);
    ++vi;
    ++vci; // OK: vci is modifiable object
    *vi = 42; // OK: vi points to mutable element
    // *vci = 13; // Error: vci points to immutable element
 
    int a[]{-5, 10, 15};
    auto ai = std::ranges::begin(a); // works with C-arrays as well
    assert(*ai == -5);
    *ai = 42; // OK
}

[編輯] 缺陷報告

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

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

[編輯] 參閱

返回只讀範圍的起始迭代器
(自定義點物件)[編輯]
(C++11)(C++14)
返回指向容器或陣列開頭的迭代器
(函式模板) [編輯]