MyClass a1 {a}; // clearer and less error-prone than the other three
MyClass a2 = {a};
MyClass a3 = a;
MyClass a4(a);
どうしてですか?
SOで答えが見つからなかったので、私自身の質問に答えさせてください。
基本的にBjarne Stroustrupの "The C++ Programming Language 4th Edition"からコピーして貼り付けます。
リストの初期化は絞り込みを許可しません(§iso.8.5.4)。あれは:
例:
void fun(double val, int val2) {
int x2 = val; // if val==7.9, x2 becomes 7 (bad)
char c2 = val2; // if val2==1025, c2 becomes 1 (bad)
int x3 {val}; // error: possible truncation (good)
char c3 {val2}; // error: possible narrowing (good)
char c4 {24}; // OK: 24 can be represented exactly as a char (good)
char c5 {264}; // error (assuming 8-bit chars): 264 cannot be
// represented as a char (good)
int x4 {2.0}; // error: no double to int value conversion (good)
}
=が{}よりも優先されるonlyの状況は、初期化子によって決定された型を取得するためにauto
キーワードを使用する場合です。
例:
auto z1 {99}; // z1 is an initializer_list<int>
auto z2 = 99; // z2 is an int
強い理由がない限り、代わりに{}初期化を使用してください。
中括弧の初期化を使用する理由はたくさんありますが、initializer_list<>
コンストラクターが他のコンストラクターより優先されることに注意してください。例外はdefault-constructorです。 。これは、T
型のコンストラクタが初期化子リストか単純な古いctorのどちらかになる可能性があるコンストラクタとテンプレートに問題を引き起こします。
struct Foo {
Foo() {}
Foo(std::initializer_list<Foo>) {
std::cout << "initializer list" << std::endl;
}
Foo(const Foo&) {
std::cout << "copy ctor" << std::endl;
}
};
int main() {
Foo a;
Foo b(a); // copy ctor
Foo c{a}; // copy ctor (init. list element) + initializer list!!!
}
そのようなクラスに遭遇しないと仮定すると、初期化リストを使用しない理由はほとんどありません。
リストの初期化を使用する利点についてはすでにすばらしい答えがありますが、私の個人的な経験則では可能な限り中括弧を使用するのではなく、概念上の意味に依存させるようにします。
私の経験では、このルールセットはデフォルトで中括弧を使用するよりもずっと一貫して適用できますが、使用できない場合や、括弧付きの「通常の」関数呼び出し構文とは異なる意味を持つ場合はすべての例外を明示的に記憶する(別のオーバーロードを呼び出す).
例えばstd::vector
のような標準的なライブラリタイプにうまくフィットします:
vector<int> a{10,20}; //Curly braces -> fills the vector with the arguments
vector<int> b(10,20); //Parenthesis -> uses arguments to parametrize some functionality,
vector<int> c(it1,it2); //like filling the vector with 10 integers or copying a range.
vector<int> d{}; //empty braces -> default constructs vector, which is equivalent
//to a vector that is filled with zero elements