相关文章推荐
忐忑的薯片  ·  Online Go tutorial(1) ...·  1 周前    · 
踏实的冲锋衣  ·  python - ...·  1 年前    · 

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

在使用統一初始化時,發現隱含縮小轉換。

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

當您知道可能轉換的值範圍可以符合目標時,可以進行縮小轉換。 在此情況下,您知道的比編譯器還多。 如果您刻意進行縮小轉換,請使用靜態轉換來明確表示您的意圖。 否則,此錯誤訊息幾乎一律會指出您的程式碼中有錯誤。 您可以修正此問題,方法是確定您初始化的物件具有足以處理輸入的類型。

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

// C2397.cpp -- C++ narrowing conversion diagnostics
// Compile by using: cl /EHsc C2397.cpp
#include <vector>
struct S1 {
    int m1;
    double m2, m3;
void function_C2397(double d1) {
    char c1 { 127 };          // OK
    char c2 { 513 };          // error C2397
    std::vector<S1> vS1;
    vS1.push_back({ d1, 2, 3 }); // error C2397
    // Possible fix if you know d1 always fits in an int
    vS1.push_back({ static_cast<int>(d1), 2, 3 });