Share via


Upozornění kompilátoru (úroveň 1) C4838

převod z "type_1" na "type_2" vyžaduje zužující převod.

Při použití inicializace agregace nebo inicializace seznamu byla nalezena implicitní zužující převod.

Jazyk C umožňuje implicitní zužování převodů v přiřazeních a inicializaci a jazyk C++ vyhovuje, i když neočekávané zúžení je příčinou mnoha chyb kódu. Aby byl kód bezpečnější, standard C++ vyžaduje diagnostickou zprávu, když v seznamu inicializace dojde ke zužování převodu. V jazyce Visual C++ je diagnostická chyba kompilátoru C2397 při použití syntaxe jednotné inicializace podporované od sady Visual Studio 2015. Kompilátor generuje upozornění C4838 při použití syntaxe inicializace seznamu nebo agregace podporované sadou Visual Studio 2013.

Zužující převod může být v pořádku, když víte, že možný rozsah převedených hodnot se vejde do cíle. V tomto případě víte víc, než kompilátor dělá. Pokud konverzní převod zužujete záměrně, zajistěte explicitní záměr pomocí statického přetypování. V opačném případě tato zpráva upozornění téměř vždy značí, že v kódu máte chybu. Můžete ho opravit tím, že zajistíte, že objekty, které inicializujete, mají typy, které jsou dostatečně velké pro zpracování vstupů.

Následující ukázka vygeneruje C4838 a ukazuje jeden způsob, jak ho opravit:

// 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
}