Share via


Avertissement du compilateur (niveau 1) C4838

la conversion de 'type_1' en 'type_2' nécessite une conversion étroite

Une conversion restrictive implicite a été trouvée lors de l’utilisation de l’initialisation d’agrégation ou de liste.

Le langage C permet des conversions de réduction implicites dans les affectations et l’initialisation, et C++ suit la suite, même si le rétrécissement inattendu est une cause de nombreuses erreurs de code. Pour sécuriser le code, la norme C++ nécessite un message de diagnostic lorsqu’une conversion restrictive se produit dans une liste d’initialisation. Dans Visual C++, le diagnostic est l’erreur du compilateur C2397 lors de l’utilisation de la syntaxe d’initialisation uniforme prise en charge à partir de Visual Studio 2015. Le compilateur génère l’avertissement C4838 lors de l’utilisation de la syntaxe d’initialisation de liste ou d’agrégation prise en charge par Visual Studio 2013.

Une conversion restrictive peut être correcte lorsque vous connaissez la plage possible de valeurs converties peut s’adapter à la cible. Dans ce cas, vous savez plus que le compilateur. Si vous effectuez une conversion restrictive intentionnellement, rendez vos intentions explicites à l’aide d’un cast statique. Dans le cas contraire, ce message d’avertissement indique presque toujours que vous avez un bogue dans votre code. Vous pouvez le corriger en vous assurant que les objets que vous initialisez ont des types suffisamment volumineux pour gérer les entrées.

L’exemple suivant génère l’erreur C4838 et montre un moyen de le corriger :

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