1. ホーム
  2. c++

[解決済み] なぜリストの初期化(中括弧を使用)が他の方法より優れているのですか?

2022-03-18 16:35:43

質問

MyClass a1 {a};     // clearer and less error-prone than the other three
MyClass a2 = {a};
MyClass a3 = a;
MyClass a4(a);

なぜ?

解決方法は?

基本的には、Bjarne Stroustrupの「Space」をコピー&ペーストしています。 C++プログラミング言語 第4版 :

リスト初期化 は狭窄を許しません (§iso.8.5.4) 。ということです。

  • 整数は、その値を保持できない別の整数に変換することはできません。例えば、char をintに変換することは可能ですが、intをcharに変換することはできません。
  • 浮動小数点値は、その値を保持できない別の浮動小数点型に変換することはできません。 の値です。例えば、float から double は許されるが、double から float は許されない。
  • 浮動小数点値を整数型に変換することはできません。
  • 整数値から浮動小数点型への変換はできません。

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)

}


その のみ が {} よりも優先されるのは、次のような場合です。 auto キーワードで、イニシャライザが決定した型を取得します。

auto z1 {99};   // z1 is an int
auto z2 = {99}; // z2 is std::initializer_list<int>
auto z3 = 99;   // z3 is an int


まとめ

初期化しない強い理由がない限り、代替案よりも{}初期化を優先してください。