2026/01/20(火)cpprefjpを読もう。【一様初期化】

一様初期化 [N2672] cpprefjp

概要

一様初期化(uniform initialization)は、コンストラクタの呼び出しを
リスト初期化と合わせて波カッコで記述する構文。

リスト初期化は前回確認した初期化子リストで取り上げた。cppref

この機能により、戻り値の型が確定している文脈において、コンストラクタの引数を波カッコ内に列挙したものをreturnで返せるようになる。その際に、戻り値の型を記述する必要がない。(初期化子リストのみで良い)

仕様
  • 初期化子リストautoで受けた場合、その型はstd::initializer_list<T>に推論される。
    C++14/17以降では、要素数1の初期化子リストstd::initializer_list<T>に対し、

    • コピー初期化した場合、std::initializer_list<T>型に推論される。
    • 直接リスト初期化した場合、T型に推論される。
      wandbox
  • 関数テンプレートのパラメータとして、初期化子リストを渡して推論はできない。
    wandbox
    template<class T> void sample([[maybe_unused]]T param){};
    int main()
    {
        //sample({1,2,3}); // エラー
        sample(std::initializer_list<int>{1,2,3});
        return 0;
    }
    
  • 関数のパラメータの型が確定している場合は、初期化子リストを渡せる。
  • 関数の戻り値の型が確定している場合は、初期化子リストをreturnできる。
  • 初期化子リストコンストラクタと同じ型のパラメータをとるコンストラクタがある場合、
    リスト初期化を使用した場合は初期化子リストコンストラクタが優先され、
    そうでないコンストラクタを呼び出す場合は、丸カッコを使用する。
補足

丸カッコによる初期化は、意図せず関数宣言構文とみなされる場合がある。
波カッコによる初期化を行うことで、コンストラクタによる初期化を明示できる。

参考

【C++】初期化子リスト関連機能を大雑把に理解する