C++11 では、{} スタイルの初期化が導入されました。しかし、これらの2つの形式は
T x {...};
T x = {...};
同じ?
C++11 では、{} スタイルの初期化が導入されました。しかし、これらの2つの形式は
T x {...};
T x = {...};
同じ?
それらはまったく同じではありません。たぶん、これは反例で説明できます:
struct Foo
{
explicit Foo(std::initializer_list<int>) {}
};
int main()
{
Foo f0{1, 2, 3}; // OK
Foo f1 = {1, 2, 3}; // ERROR
}
したがって、2 番目のバリアントでは、型が初期化リストから暗黙的に構築可能である必要がありますが、最初のバージョンではそうではありません。同じことがフォームのコンストラクタにも当てはまることに注意してくださいFoo(int, int, int)
。initializer_list<int>
を勝手に選んでみました。
これは、「どこでも明示的」な哲学に従って書かれた特定の型に影響を与えます (これによりexplicit
、C++03 コードではマルチパラメーター コンストラクターがマークされていましたが、その標準では意味がありませんでした)。
ある場合にそれらを使用する場合の構文は、異なることを意味します
struct A { };
namespace X {
struct A final {};
struct A final = {};
}
最初のケースでは という構造体を定義してA
おり、2 番目のケースでは というオブジェクトを定義していますfinal
。