Partage via


Erreur du compilateur C2397

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

Une conversion de rétrécissement implicite a été trouvée lors de l’utilisation de l’initialisation uniforme.

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 du compilateur (niveau 1) 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’erreur 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 C2397 :

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