從 '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 });