Błąd kompilatora C2397
konwersja z "type_1" na "type_2" wymaga konwersji zawężającej
Znaleziono niejawną konwersję zawężającą podczas korzystania z ujednoliconej inicjalizacji.
Język C umożliwia niejawne konwersje w przypisań i inicjowania, a język C++ jest zgodny, mimo że nieoczekiwane zawężenie jest przyczyną wielu błędów kodu. Aby kod był bezpieczniejszy, standard C++ wymaga komunikatu diagnostycznego, gdy konwersja zawężająca występuje na liście inicjalizacji. W programie Visual C++diagnostyka to Błąd kompilatora C2397 podczas korzystania z ujednoliconej składni inicjowania obsługiwanej począwszy od programu Visual Studio 2015. Kompilator generuje ostrzeżenie kompilatora (poziom 1) C4838 podczas korzystania z listy lub zagregowanej składni inicjowania obsługiwanej przez program Visual Studio 2013.
Konwersja zawężająca może być w porządku, gdy wiesz, że możliwy zakres przekonwertowanych wartości może mieścić się w obiekcie docelowym. W takim przypadku wiesz więcej niż kompilator. Jeśli celowo dokonasz konwersji zawężającej, intencje będą jawne przy użyciu rzutowania statycznego. W przeciwnym razie ten komunikat o błędzie prawie zawsze wskazuje na usterkę w kodzie. Można to naprawić, upewniając się, że zainicjowane obiekty mają typy, które są wystarczająco duże, aby obsłużyć dane wejściowe.
Poniższy przykład generuje kod C2397:
// C2397.cpp
// compile with: /c
struct S {
int m1;
double m2, m3;
};
void func(double d1) {
char c1 { 127 }; // OK
char c2 { 513 }; // C2397
S arr[2]{};
arr[0] = { d1, 2.0, 3.0 }; // C2397
arr[1] = { static_cast<int>(d1), 2.0, 3.0 }; // OK
}