Namespaces
Variants

std::initializer_list

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変長引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
swap および 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 

(メンバ初期化子リストと混同しないこと)

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 の明示的または部分的な特殊化が宣言されている場合、プログラムは ill-formed です。

メンバー型

名前 定義
value_type T
reference const T &
const_reference const T &
size_type std::size_t
iterator const T *
const_iterator const T *

メンバー関数

空の初期化子リストを作成する
(public member function)
Capacity
初期化子リスト内の要素数を返す
(public member function)
Iterators
最初の要素へのポインタを返す
(public member function)
最後の要素の次を指すポインタを返す
(public member function)

非メンバー関数

std::beginをオーバーロード std::begin
(関数テンプレート)
std::endを特殊化 std::end
(関数テンプレート)
std::initializer_listに対してオーバーロードされたフリー関数テンプレート
コンテナまたは配列の先頭への逆イテレータを返す
(関数テンプレート)
(C++14)
コンテナまたは配列の終端逆イテレータを返す
(関数テンプレート)
(C++17)
コンテナが空かどうかをチェックする
(関数テンプレート)
(C++17)
基盤となる配列へのポインタを取得する
(関数テンプレート)

注記

機能テストマクロ 値 標準 機能
__cpp_initializer_lists 200806L (C++11) リスト初期化 および std::initializer_list

例

#include <cassert>
#include <initializer_list>
#include <iostream>
#include <vector>
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 now has " << 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';
    auto la = al; // トップレベルのプロキシオブジェクトの浅いコピー
    assert(la.begin() == al.begin()); // 保証: 基盤となる配列は同じ
    std::initializer_list<int> il{-3, -2, -1};
    assert(il.begin()[2] == -1); // 存在しないoperator[]の代替手段に注意
    il = al; // 浅いコピー
    assert(il.begin() == al.begin()); // 保証
//  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 now has 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

欠陥報告

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

DR 適用対象 公開時の動作 正しい動作
LWG 2129 C++11 std::initializer_list は明示的な特殊化または
部分特殊化を持つ可能性があった
この場合、プログラムは
不適格となる

関連項目

(C++20)
連続したオブジェクトシーケンスに対する非所有ビュー
(クラステンプレート)
読み取り専用文字列ビュー
(クラステンプレート)