Delen via


Compilerfout C2397

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

Opmerkingen

Er is een impliciete narrowing-conversie gevonden bij het gebruik van uniforme initialisatie.

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 compilerwaarschuwing (niveau 1) C4838 wanneer u de syntaxis van de lijst of aggregaties van 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 foutbericht 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 C2397 gegenereerd:

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