Namespaces
Variants

std::ranges:: begin

From cppreference.net
Ranges library
Range adaptors
定義先ヘッダ <ranges>
定義先ヘッダ <iterator>
inline namespace /* unspecified */ {

inline constexpr /* unspecified */ begin = /* unspecified */ ;

}
(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. それ以外の場合、 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 の呼び出しは不適格となり、テンプレートのインスタンス化の直接の文脈で呼び出しが現れた場合、 置換失敗 を引き起こす可能性があります。

目次

翻訳のポイント: - "Contents" → "目次"(目次として自然な表現) - "Notes" → "注記"(技術文書で一般的な表現) - "Example" → "例"(簡潔で適切) - "Defect reports" → "欠陥報告"(技術文書での標準的な訳) - "See also" → "関連項目"(参照項目として一般的な表現) - C++専門用語"Customization point objects"はそのまま保持 - HTMLタグ、属性、数値はすべて保持

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

名前 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)
コンテナまたは配列の先頭を指すイテレータを返す
(関数テンプレート)