Condividi tramite


Avviso del compilatore (livello 1) C4838

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 di aggregazione o elenco.

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 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 avviso indica quasi sempre che si dispone di 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 C4838 e mostra un modo per correggerlo:

// C4838.cpp -- C++ narrowing conversion diagnostics
// Compile by using: cl /EHsc C4838.cpp

struct S1 {
    int m1;
    double m2, m3;
};

void function_C4838(double d1) {
    double ad[] = { 1, d1 }; // OK
    int ai[] = { 1, d1 };    // warning C4838
    S1 s11 = { 1, 2, d1 };   // OK
    S1 s12 { d1, 2, 3 };     // warning C4838
    S1 s13 { static_cast<int>(d1), 2, 3 }; // possible fix for C4838
}