Megosztás a következőn keresztül:


C2397 fordítóhiba

a "type_1" és a "type_2" közötti átalakítás szűkítést igényel

Megjegyzések

Az egységes inicializálás használatakor implicit szűkítő konverziót észleltünk.

A C nyelv lehetővé teszi a hozzárendelések és inicializációk implicit szűkítését, a C++ pedig követi az öltönyt, annak ellenére, hogy a váratlan szűkítés számos kódhibát okoz. A kód biztonságossá tétele érdekében a C++ szabvány diagnosztikai üzenetet igényel, ha egy inicializálási listában szűkítési átalakítás történik. A Visual C++-ban a diagnosztika a C2397 fordítóhiba, amikor a Visual Studio 2015-ben támogatott egységes inicializálási szintaxist használja. A fordító a Visual Studio 2013 által támogatott lista- vagy összesítési inicializálási szintaxis használatakor létrehozza a Fordító figyelmeztetést (1. szint) C4838 .

A szűkítő konverzió akkor lehet megfelelő, ha tudja, hogy a konvertált értékek lehetséges tartománya elfér a célban. Ebben az esetben többet tud, mint a fordító. Ha szándékosan szűkíti a konverziót, a szándékait statikus leadással egyértelművé teheti. Ellenkező esetben ez a hibaüzenet szinte mindig azt jelzi, hogy hiba van a kódban. Kijavíthatja, ha meggyőződik arról, hogy az inicializálandó objektumok olyan típusok, amelyek elég nagyok a bemenetek kezeléséhez.

Example

Az alábbi példa C2397-et hoz létre:

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