Delen via


Compilerwaarschuwing (niveau 1) C4838

conversie van 'type_1' naar 'type_2' vereist een smalle conversie

Opmerkingen

Er is een impliciete vermalingsconversie gevonden bij het gebruik van initialisatie van aggregaties of lijsten.

De C-taal maakt impliciete vermalingsconversies in toewijzingen en initialisatie mogelijk, en C++ volgt een passend voorbeeld, ook al is onverwacht beperken een oorzaak van veel codefouten. Om code veiliger te maken, vereist de C++-standaard een diagnostisch bericht wanneer er een beperkte conversie plaatsvindt in een initialisatielijst. In Visual C++is de diagnose compilerfout C2397 bij het gebruik van de uniforme initialisatiesyntaxis die vanaf Visual Studio 2015 wordt ondersteund. De compiler genereert waarschuwing C4838 wanneer u de syntaxis van de lijst of aggregaties initialisatie gebruikt die wordt ondersteund door Visual Studio 2013.

Een vermalingsconversie kan in orde zijn wanneer u weet dat het mogelijke bereik van geconverteerde waarden in het doel past. In dit geval weet u meer dan de compiler doet. Als u opzettelijk een vermalingsconversie maakt, moet u uw intenties expliciet maken met behulp van een statische cast. Anders geeft dit waarschuwingsbericht bijna altijd aan dat u een fout in uw code hebt. U kunt dit oplossen door ervoor te zorgen dat de objecten die u initialiseert, typen hebben die groot genoeg zijn om de invoer te verwerken.

Example

In het volgende voorbeeld wordt C4838 gegenereerd en ziet u een manier om dit op te lossen:

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