Freigeben über


Compilerfehler C2397

Die Konvertierung von "type_1" in "type_2" erfordert eine schmale Konvertierung.

Beim Verwenden der Uniform Initialisierung wurde eine implizite Eingrenzungskonvertierung gefunden.

Die C-Sprache ermöglicht implizite Eingrenzungskonvertierungen in Zuordnungen und Initialisierung, und C++ folgt dem Anzug, obwohl unerwartetes Eingrenzen eine Ursache für viele Codefehler ist. Um Code sicherer zu machen, erfordert der C++-Standard eine Diagnosemeldung, wenn eine schmale Konvertierung in einer Initialisierungsliste auftritt. In Visual C++ ist die Diagnose Compilerfehler C2397, wenn die einheitliche Initialisierungssyntax verwendet wird, die ab Visual Studio 2015 unterstützt wird. Der Compiler generiert Compilerwarnung (Ebene 1) C4838 bei Verwendung der von Visual Studio 2013 unterstützten Listen- oder Aggregatinitialisierungssyntax.

Eine schmale Konvertierung kann in Ordnung sein, wenn Sie wissen, dass der mögliche Bereich konvertierter Werte in das Ziel passen kann. In diesem Fall wissen Sie mehr als der Compiler. Wenn Sie eine schmale Konvertierung absichtlich vornehmen, machen Sie Ihre Absichten explizit, indem Sie eine statische Umwandlung verwenden. Andernfalls weist diese Fehlermeldung fast immer darauf hin, dass in Ihrem Code ein Fehler auftritt. Sie können dies beheben, indem Sie sicherstellen, dass die Objekte, die Sie initialisieren, Über Typen verfügen, die groß genug sind, um die Eingaben zu verarbeiten.

Im folgenden Beispiel wird C2397 generiert:

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