Errore del compilatore C2397

la conversione da 'type_1' a 'type_2' richiede una conversione verso un tipo di dati più piccolo

È stata rilevata una conversione di tipo narrowing implicito quando si usa l'inizializzazione uniforme.

Il linguaggio C consente conversioni implicite di restringimento nelle assegnazioni e l'inizializzazione e C++ segue l'impostazione appropriata, anche se un restringimento imprevisto è una causa di molti errori di codice. Per rendere il codice più sicuro, lo standard C++ richiede un messaggio di diagnostica quando si verifica una conversione di tipo narrowing in un elenco di inizializzazione. In Visual C++, la diagnostica è Errore del compilatore C2397 quando si usa la sintassi di inizializzazione uniforme supportata a partire da Visual Studio 2015. Il compilatore genera l'avviso del compilatore (livello 1) C4838 quando si usa la sintassi di inizializzazione dell'elenco o dell'aggregazione supportata da Visual Studio 2013.

Una conversione di tipo narrowing può essere corretta quando si sa che l'intervallo possibile di valori convertiti può rientrare nella destinazione. In questo caso, si conosce più del compilatore. Se si effettua una conversione verso un tipo di dati più piccolo intenzionalmente, rendere esplicite le proprie intenzioni usando un cast statico. In caso contrario, questo messaggio di errore indica quasi sempre un bug nel codice. È possibile correggerlo assicurandosi che gli oggetti inizializzati abbiano tipi sufficientemente grandi da gestire gli input.

L'esempio seguente genera l'errore 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
}