名前空間
変種
操作

std::initializer_list

提供: cppreference.com
< cpp‎ | utility
 
 
 
 

(メンバ初期化子リストと混同しないでください)

ヘッダ <initializer_list> で定義
template< class T >
class initializer_list;
(C++11およびそれ以降)

std::initializer_list<T> 型のオブジェクトは const T 型のオブジェクトの配列へのアクセスを提供する軽量なプロキシオブジェクトです。

std::initializer_list オブジェクトは以下の場合に自動的に構築されます。

  • 波括弧初期化子リストを使用してオブジェクトをリスト初期化し、対応するコンストラクタが std::initializer_list 引数を取る場合
  • 波括弧初期化子リストを代入演算子の右辺の値として使用し、対応する代入演算子が std::initializer_list 引数を取る場合
  • 波括弧初期化子リストを関数呼び出しの実引数として使用し、対応する関数が std::initializer_list 引数を取る場合
  • 波括弧初期化子リストを auto に束縛する場合 (範囲 for ループを含みます)

std::initializer_list はポインタ2個またはポインタ+長さとして実装されます。 std::initializer_list をコピーしても中身のオブジェクトはコピーされません。

std::initializer_list オブジェクトの生存期間終了後に中身の配列が存在することは保証されません。 std::initializer_list のための記憶域は未規定です (状況に応じて自動、一時、読み込み専用の static メモリなどになります)。 (C++14以前)
中身の配列は const T[N] 型の一時配列です。 各々の要素は元々の初期化子リストの対応する要素からコピー初期化されます。 ただし縮小変換は無効です。 中身の配列の生存期間は他のあらゆる一時オブジェクトと同様です。 ただし配列からの std::initializer_list オブジェクトの初期化は、一時オブジェクトを参照に束縛する場合とまったく同様に、その配列の生存期間を延長します (まったく同様の例外もあります)。 中身の配列は読み込み専用メモリに確保される場合があります。 (C++14およびそれ以降)

std::initializer_list の明示的または部分的な特殊化が宣言された場合、プログラムは ill-formed です。

(C++17およびそれ以降)

目次

[編集] メンバ型

メンバ型 定義
value_type T
reference const T&
const_reference const T&
size_type std::size_t
iterator const T*
const_iterator const T*

[編集] メンバ関数

空の初期化子リストを作成します
(パブリックメンバ関数) [edit]
容量
初期化子リスト内の要素数を返します
(パブリックメンバ関数) [edit]
イテレータ
最初の要素へのポインタを返します
(パブリックメンバ関数) [edit]
最後の要素の1つ次へのポインタを返します
(パブリックメンバ関数) [edit]

[編集] 非メンバ関数

std::begin の特殊化
(関数テンプレート) [edit]
std::end の特殊化
(関数テンプレート) [edit]
ヘッダ <iterator> で定義
std::rbegin の特殊化
(関数) [edit]
std::rend の特殊化
(関数) [edit]

[編集]

#include <iostream>
#include <vector>
#include <initializer_list>
 
template <class T>
struct S {
    std::vector<T> v;
    S(std::initializer_list<T> l) : v(l) {
         std::cout << "constructed with a " << l.size() << "-element list\n";
    }
    void append(std::initializer_list<T> l) {
        v.insert(v.end(), l.begin(), l.end());
    }
    std::pair<const T*, std::size_t> c_arr() const {
        return {&v[0], v.size()};  // return 文でのコピーリスト初期化。
                                   // これは std::initializer_list の使用ではありません。
    }
};
 
template <typename T>
void templated_fn(T) {}
 
int main()
{
    S<int> s = {1, 2, 3, 4, 5}; // コピーリスト初期化。
    s.append({6, 7, 8});      // 関数呼び出しでのリスト初期化。
 
    std::cout << "The vector size is now " << s.c_arr().second << " ints:\n";
 
    for (auto n : s.v)
        std::cout << n << ' ';
    std::cout << '\n';
 
    std::cout << "Range-for over brace-init-list: \n";
 
    for (int x : {-1, -2, -3}) // auto のためのルールによりこの範囲 for が動作します。
        std::cout << x << ' ';
    std::cout << '\n';
 
    auto al = {10, 11, 12};   // auto のための特別なルール。
 
    std::cout << "The list bound to auto has size() = " << al.size() << '\n';
 
//  templated_fn({1, 2, 3}); // コンパイルエラー。 {1, 2, 3} は式ではなく、
                             // 型を持たないため、 T を推定できません。
    templated_fn<std::initializer_list<int>>({1, 2, 3}); // OK。
    templated_fn<std::vector<int>>({1, 2, 3});           // これも OK。
}

出力:

constructed with a 5-element list
The vector size is now 8 ints:
1 2 3 4 5 6 7 8
Range-for over brace-init-list: 
-1 -2 -3 
The list bound to auto has size() = 3