名前空間
変種
操作

std::ranges::begin

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
ヘッダ <ranges> で定義
ヘッダ <iterator> で定義
inline namespace /* 未指定 */ {

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

}
(C++20以降)
(カスタマイズポイントオブジェクト)
呼び出しシグネチャ
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 + 0 と式等価です(t が配列型の場合)。
  2. それ以外の場合、t.begin() を呼び出し、その結果の型が std::input_or_output_iterator をモデル化する場合、decay-copy(t.begin())(C++23まで)auto(t.begin())(C++23以降)
  3. それ以外の場合、T がクラス型または列挙型であり、引数依存名前探索のみによって確立される begin の意味で begin(t) を呼び出し、その結果の型が std::input_or_output_iterator をモデル化する場合、decay-copy(begin(t))(C++23まで)auto(begin(t))(C++23以降)

上記以外の場合、ranges::begin の呼び出しは ill-formed となり、テンプレートインスタンス化の即時コンテキストで呼び出しが現れると、SFINAE を引き起こす可能性があります。

目次

カスタマイゼーションポイントオブジェクト

ranges::begin という名前は、const であり、リテラルsemiregular クラス型の**カスタマイゼーションポイントオブジェクト**を表します。説明のため、その型の cv-修飾されていないバージョンを __begin_fn と表記します。

__begin_fn のすべてのインスタンスは等価です。同じ引数に対して異なる __begin_fn 型のインスタンスを呼び出す効果は、インスタンスを表す式が左辺値か右辺値か、const 修飾されているかどうかに関わらず等価です(ただし、volatile 修飾されたインスタンスが呼び出し可能である必要はありません)。したがって、ranges::begin は自由にコピーでき、そのコピーは相互に交換可能です。

型のセット Args... が与えられた場合、ranges::begin への引数に対する要件を std::declval<Args>()... が満たす場合、__begin_fn は以下をモデル化します。

それ以外の場合、__begin_fn の関数呼び出し演算子はオーバーロード解決に参加しません。

[編集] Notes

引数が右辺値(つまり T がオブジェクト型)で、ranges::enable_borrowed_range<std::remove_cv_t<T>>false の場合、ranges::begin の呼び出しは ill-formed となり、これも substitution failure を引き起こします。

すべてのケースで、戻り値の型は std::input_or_output_iterator をモデル化します。

C++20 標準では、基になる begin 関数呼び出しが prvalue を返す場合、戻り値はマテリアライズされた一時オブジェクトからムーブ構築されることが要求されています。すべての実装は直接 prvalue を返します。この要件は、C++20 後に提案された P0849R8 によって、実装に合わせるように修正されています。

[編集] Example

#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
}

[編集] Defect reports

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
P2602R2 C++20 ADL によって見つけられる特定の非メンバ begin を禁止する仕組みがありました。 その仕組みは削除されました。

[編集] See also

読み取り専用rangeの先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
(C++11)(C++14)
コンテナまたは配列の先頭を指すイテレータを返す
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)