Share via


Compilerwarnung (Ebene 1) C4838

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

Beim Verwenden der Aggregat- oder Listeninitialisierung 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 Warnung 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 Warnmeldung fast immer darauf hin, dass im Code ein Fehler vorliegt. 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 C4838 generiert und eine Möglichkeit zum Beheben gezeigt:

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