Namespaces
Variants

std::ranges::begin

ja.cppreference.net より
 
 
レンジライブラリ
レンジアダプタ
 
ヘッダで定義 <ranges>
ヘッダで定義 <iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ begin = /* unspecified */;
}
(C++20以上)
(カスタマイゼーションポイントオブジェクト)
呼び出しシグネチャ
template< class T >
    requires /* see below */
constexpr std::input_or_output_iterator auto begin( T&& t );
(C++20以上)

引数の最初の要素へのイテレータを返します。

引数が左辺値であるか、または ranges::enable_borrowed_range<std::remove_cv_t<T>> が true である場合、 ranges::begin への呼び出しは 式等価 です:

  1. t + 0 t が配列型の場合。
    • std::remove_all_extents_t<std::remove_reference_t<T>> が不完全型の場合、 ranges::begin への呼び出しは不適格となり、診断は不要です。
  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 への呼び出しは不適格となり、テンプレートのインスタンス化の直接の文脈で呼び出しが行われた場合、 置換失敗 が発生する可能性があります。

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

名前 ranges::begin は カスタマイゼーションポイントオブジェクト を表し、これは 関数オブジェクト のconstな リテラル semiregular クラス型である。詳細は CustomizationPointObject を参照。

注記

引数が右辺値(すなわち T がオブジェクト型)であり、かつ ranges:: enable_borrowed_range < std:: remove_cv_t < T >> が false の場合、 ranges::begin の呼び出しは不適格となり、これは置換失敗も引き起こします。

戻り値の型はすべての場合において 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は変更可能なオブジェクト
    *vi = 42; // OK: viは変更可能な要素を指す
    // *vci = 13; // エラー: vciは不変要素を指す
    int a[]{-5, 10, 15};
    auto ai = std::ranges::begin(a); // C配列でも動作する
    assert(*ai == -5);
    *ai = 42; // OK
}

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
P2602R2 C++20 特定の非メンバー begin を ADL によって見つけることを禁止する機構が存在する そのような機構を削除

関連項目

読み取り専用範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)
(C++11) (C++14)
コンテナまたは配列の先頭を指すイテレータを返す
(関数テンプレート)