Dela via


Kompilatorvarning (nivå 1) C4838

konvertering från "type_1" till "type_2" kräver en begränsad konvertering

Anmärkningar

En implicit förträngningskonvertering hittades vid användning av aggregering eller listinitiering.

C-språket tillåter implicita begränsade konverteringar i tilldelningar och initiering, och C++ följer efter, även om oväntad förträngning är en orsak till många kodfel. För att göra koden säkrare kräver C++-standarden ett diagnostikmeddelande när en begränsad konvertering sker i en initieringslista. I Visual C++är diagnostiken kompilatorfel C2397 när du använder den enhetliga initieringssyntax som stöds från och med Visual Studio 2015. Kompilatorn genererar varning C4838 när du använder listan eller den aggregerade initieringssyntaxen som stöds av Visual Studio 2013.

En begränsad konvertering kan vara okej när du vet att det möjliga intervallet med konverterade värden får plats i målet. I det här fallet vet du mer än vad kompilatorn gör. Om du avsiktligt gör en begränsad konvertering gör du dina avsikter explicita med hjälp av en statisk gjutning. Annars indikerar det här varningsmeddelandet nästan alltid att du har en bugg i koden. Du kan åtgärda det genom att se till att de objekt som du initierar har typer som är tillräckligt stora för att hantera indata.

Example

Följande exempel genererar C4838 och visar ett sätt att åtgärda det:

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