Udostępnij za pośrednictwem


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
}