Namespaces
Variants

std:: initializer_list

From cppreference.net
Utilities library

( member initializer list と混同しないこと)

ヘッダーで定義 <initializer_list>
template < class T >
class initializer_list ;
(C++11以降)

std::initializer_list<T> 型のオブジェクトは、 const T 型のオブジェクト配列(読み取り専用メモリに割り当てられている可能性がある)へのアクセスを提供する軽量プロキシオブジェクトです。

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

std::initializer_list は、ポインタのペアまたはポインタと長さとして実装される可能性があります。 std::initializer_list をコピーしても、対応する初期化リストの バッキング配列 はコピーされません。

プログラムは、 std::initializer_list の明示的特殊化または部分特殊化が宣言された場合、不適格となります。

目次

メンバー型

名前 定義
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)
連続したオブジェクトシーケンスに対する非所有ビュー
(クラステンプレート)
読み取り専用文字列ビュー
(クラステンプレート)