コンパイラ エラー C2397

'type_1' から 'type_2' への変換には縮小変換が必要です

一様初期化を使用するときに、暗黙的な縮小変換が見つかりました。

C 言語では、割り当てと初期化で暗黙的な縮小変換が可能であり、予期しない縮小は多くのコード エラーの原因ですが、C++ はそれに従います。 コードをより安全にするために、C++ 標準では、縮小変換が初期化リストで発生した場合に診断メッセージが必要です。 Visual C++ では、Visual Studio 2015 以降でサポートされている一様な初期化構文を使用すると、診断はコンパイラ エラー C2397 になります。 Visual Studio 2013 でサポートされているリストまたは集計の初期化構文を使用すると、コンパイラでコンパイラの警告 (レベル 1) C4838 が生成されます。

縮小変換は、変換された値の可能な範囲がターゲットに収まることがわかっている場合に問題ありません。 この場合は、ユーザーがコンパイラよりも多くを知っているということです。 縮小変換を意図的に行う場合は、静的キャストを使用して意図を明示的にします。 それ以外の場合、このエラー メッセージは、ほとんど常にコードにバグがあることを示しています。 解決するには、初期化するオブジェクトに入力を処理するのに十分な大きな型が含まれていることを確認します。

次の例では C2397 が生成されます。

// C2397.cpp
// compile with: /c
struct S {
   int m1;
   double m2, m3;
};

void func(double d1) {
   char c1 { 127 };   // OK
   char c2 { 513 };   // C2397
   
   S arr[2]{};
   arr[0] = { d1, 2.0, 3.0 };   // C2397
   arr[1] = { static_cast<int>(d1), 2.0, 3.0 };   // OK
}