名前空間
変種
操作

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 に束縛する場合 (ranged for ループを含みます)

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

initializer list オブジェクトの生存期間終了後に中身の配列が存在することは保証されません。 std::initializer_list のための記憶域は未規定です (状況に応じて自動、一時、読み込み専用の static メモリなどになります)。 (C++14以前)
中身の配列は const T[N] 型の一時配列です。 各々の要素は元々の初期化子リストの対応する要素からコピー初期化されます。 ただしナローイング変換は無効です。 中身の配列の存在期間は他のあらゆる一時オブジェクトと同様です。 ただし配列からの 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()};  // copy list-initialization in return statement
                                   // this is NOT a use of std::initializer_list
    }
};
 
template <typename T>
void templated_fn(T) {}
 
int main()
{
    S<int> s = {1, 2, 3, 4, 5}; // copy list-initialization
    s.append({6, 7, 8});      // list-initialization in function call
 
    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}) // the rule for auto makes this ranged-for work
        std::cout << x << ' ';
    std::cout << '\n';
 
    auto al = {10, 11, 12};   // special rule for auto
 
    std::cout << "The list bound to auto has size() = " << al.size() << '\n';
 
//    templated_fn({1, 2, 3}); // compiler error! "{1, 2, 3}" is not an expression,
                             // it has no type, and so T cannot be deduced
    templated_fn<std::initializer_list<int>>({1, 2, 3}); // OK
    templated_fn<std::vector<int>>({1, 2, 3});           // also 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