私はC++を学んでいて、リストの初期化について読んでいるところまで来ました。少し混乱した後、構文の重複が原因で、一様な初期化とリストの初期化は、C++ 11 の新機能 (重複しているとはいえ) は実際には 2 つの異なるものであることがわかりました。ですから、質問をする前に要約したいと思います。何か間違っている場合は訂正してください (このトピックについて何かが誤解される前に..)
組み込み型に関する限り、それらを初期化するための構文は次のとおりです (読みやすくするために int を想定しています)。
// defines a default initialized int
int a;
// defines a value initialized int (binary zeroes)
int a{};
// equivalent definitions,define an int variable of value 10:
int a=10;
int a(10);
int a{10};
int a={10};
// equivalent definitions,define a temporary int variable of value 10:
int(10);
int{10};
// equivalent definitions,define a temporary int variable that is value initialized to 0:
int();
int{};
ここで興味深いのは、集約型 (配列と集約構造体) の均一な初期化を使用することです。C++11 までは、リスト初期化子を使用して配列と集約クラスを初期化できました。
int array[]={1,2,3};
struct aggregate {
int a;
double b;
};
aggregate a={1,2.3};
これで、新しい標準により、統一された初期化に新しい構文を使用できることがわかりました。
int array[]{1,2,3};
aggregate a{1,2,3};
これは、コンストラクターのメンバー初期化リストで使用する場合に便利です。
そして今、クラスの種類に。クラスが initializers_list コンストラクターを定義していない場合:
// equivalent definitions,define a class_type variable,default initialized:
class_type name;
class_type name{};
// equivalent definitions,define a class_type variable,using the appropriate constructor:
class_type name(*args*);
class_type name{*args*};
class_type name={*args*};
// defines a class_type variable and calls copy-constructor (allows implicit conversion to class_type if converting constructor is non-explicit)
class_type name=name2;
// equivalent definitions,define a temporary class_type object,default initialized
class_type();
class_type{};
// equivalent definitions,define a temporary class_type object,initialized by the appropriate constructor
class_type(*args*);
class_type{*args*};
クラスが class_type::class_type(const std::initializer_list&) コンストラクターを定義すると、他のコンストラクターよりも優先されることを知っています (空のリストであり、デフォルトのコンストラクターが優先される場合を除きます)。
さて、私の質問は次のとおりです。
波括弧リストで使用すると何が=
変わるのですか? 私が考えることができる唯一の違いは、init リスト コンストラクターが明示的かどうかです。
class_type name{*args*};
class_type name={*args*};
と同じ
class_type name({*args*});
class_type name=class_type(std::initializer_list({*args*}));
コピーの初期化の暗黙の変換が関係していますか?それは唯一の違いですか?
明らかに間違ったことを言っている場合は、訂正してください。