Sdílet prostřednictvím


Chyba kompilátoru C2397

převod z "type_1" na "type_2" vyžaduje zužující převod.

Při použití jednotné inicializace byl nalezen implicitní zužující převod.

Jazyk C umožňuje implicitní zužování převodů v přiřazeních a inicializaci a jazyk C++ vyhovuje, i když neočekávané zúžení je příčinou mnoha chyb kódu. Aby byl kód bezpečnější, standard C++ vyžaduje diagnostickou zprávu, když v seznamu inicializace dojde ke zužování převodu. V jazyce Visual C++ je diagnostická chyba kompilátoru C2397 při použití syntaxe jednotné inicializace podporované od sady Visual Studio 2015. Kompilátor generuje upozornění kompilátoru (úroveň 1) C4838 při použití syntaxe inicializace seznamu nebo agregace podporované sadou Visual Studio 2013.

Zužující převod může být v pořádku, když víte, že možný rozsah převedených hodnot se vejde do cíle. V tomto případě víte víc, než kompilátor dělá. Pokud konverzní převod zužujete záměrně, zajistěte explicitní záměr pomocí statického přetypování. V opačném případě tato chybová zpráva téměř vždy indikuje, že máte v kódu chybu. Můžete ho opravit tím, že zajistíte, že objekty, které inicializujete, mají typy, které jsou dostatečně velké pro zpracování vstupů.

Následující ukázka vygeneruje 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
}