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


Fordító figyelmeztetés (1. szint) C4838

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

Megjegyzések

Az összesítés vagy lista inicializálásakor 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ó c4838 figyelmeztetést generál a Visual Studio 2013 által támogatott lista- vagy összesítési inicializálási szintaxis használatakor.

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 figyelmeztető ü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 a C4838-at hozza létre, és a javítás egyik módját mutatja be:

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