컴파일러 오류 C2397
'type_1'에서 'type_2'(으)로의 변환에는 축소 변환이 필요합니다.
균일한 초기화를 사용할 때 암시적 축소 변환이 발견되었습니다.
C 언어는 할당 및 초기화에서 암시적 축소 변환을 허용하며, 예기치 않은 축소가 많은 코드 오류의 원인인 경우에도 C++는 소송을 따릅니다. 코드를 더 안전하게 만들기 위해 C++ 표준은 초기화 목록에서 축소 변환이 발생할 때 진단 메시지가 필요합니다. Visual C++에서 Visual Studio 2015부터 지원되는 균일한 초기화 구문을 사용하는 경우 진단은 컴파일러 오류 C2397입니다. 컴파일러는 Visual Studio 2013에서 지원하는 목록 또는 집계 초기화 구문을 사용할 때 컴파일러 경고(수준 1) C4838을 생성합니다.
변환된 값의 가능한 범위가 대상에 맞을 수 있다는 것을 알고 있으면 축소 변환이 괜찮을 수 있습니다. 이 경우 컴파일러가 수행하는 것보다 더 많은 것을 알 수 있습니다. 의도적으로 축소 변환을 만드는 경우 정적 캐스트를 사용하여 의도를 명시적으로 지정합니다. 그렇지 않으면 이 오류 메시지는 코드에 버그가 있음을 거의 항상 나타냅니다. 초기화한 개체에 입력을 처리할 수 있을 만큼 큰 형식이 있는지 확인하여 수정할 수 있습니다.
다음 샘플에서는 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
}