分享方式:


編譯器警告 (層級 1) C4838

從 'type_1' 轉換成 'type_2' 需要縮小轉換

使用匯總或清單初始化時,發現隱含縮小轉換。

C 語言允許在指派和初始化中隱含縮小轉換,而 C++ 也適合使用,即使非預期的縮小是許多程式碼錯誤的原因。 為了讓程式碼更安全,當初始化清單中發生縮小轉換時,C++ 標準需要診斷訊息。 在 Visual C++ 中,使用 Visual Studio 2015 中支援的統一初始化語法時,診斷為 編譯器錯誤 C2397 。 使用 Visual Studio 2013 所支援的清單或匯總初始化語法時,編譯器會產生警告 C4838。

當您知道轉換值可能的範圍可以符合目標時,縮小轉換可以正常。 在此情況下,您知道的不僅僅是編譯器。 如果您刻意進行縮小轉換,請使用靜態轉換明確您的意圖。 否則,這個警告訊息幾乎一律表示您的程式碼中有 Bug。 您可以藉由確定初始化的物件具有足以處理輸入的類型,來修正它。

下列範例會產生 C4838,並示範修正它的其中一種方式:

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