std:: initializer_list
( member initializer list と混同しないこと)
|
ヘッダーで定義
<initializer_list>
|
||
|
template
<
class
T
>
class initializer_list ; |
(C++11以降) | |
std::initializer_list<T>
型のオブジェクトは、
const
T
型のオブジェクト配列(読み取り専用メモリに割り当てられている可能性がある)へのアクセスを提供する軽量プロキシオブジェクトです。
A
std::initializer_list
オブジェクトは以下の場合に自動的に構築されます:
-
a
波括弧で囲まれた初期化子リスト
がオブジェクトの
リスト初期化
に使用され、対応するコンストラクタが
std::initializer_listパラメータを受け入れる場合、 -
波括弧で囲まれた初期化子リストが
代入
の右オペランドとして、または
関数呼び出し引数
として使用され、対応する代入演算子/関数が
std::initializer_listパラメータを受け入れる場合、 - 波括弧で囲まれた初期化子リストが auto に束縛される場合( 範囲forループ 内を含む)。
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
(関数テンプレート) |
|
|
(C++11)
|
std::end
を特殊化
std::end
(関数テンプレート) |
|
|
|
(C++14)
|
コンテナまたは配列の先頭への逆イテレータを返す
(関数テンプレート) |
|
(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)
|
連続したオブジェクトシーケンスに対する非所有ビュー
(クラステンプレート) |
|
(C++17)
|
読み取り専用文字列ビュー
(クラステンプレート) |