컴파일러 경고(수준 1) C4838
'type_1'에서 'type_2'(으)로의 변환에는 축소 변환이 필요합니다.
집계 또는 목록 초기화를 사용할 때 암시적 축소 변환이 발견되었습니다.
C 언어는 할당 및 초기화에서 암시적 축소 변환을 허용하며, 예기치 않은 축소가 많은 코드 오류의 원인인 경우에도 C++는 소송을 따릅니다. 코드를 더 안전하게 만들기 위해 C++ 표준은 초기화 목록에서 축소 변환이 발생할 때 진단 메시지가 필요합니다. Visual C++에서 Visual Studio 2015부터 지원되는 균일한 초기화 구문을 사용하는 경우 진단은 컴파일러 오류 C2397 입니다. 컴파일러는 Visual Studio 2013에서 지원하는 목록 또는 집계 초기화 구문을 사용할 때 경고 C4838을 생성합니다.
변환된 값의 가능한 범위가 대상에 맞을 수 있다는 것을 알고 있으면 축소 변환이 괜찮을 수 있습니다. 이 경우 컴파일러가 수행하는 것보다 더 많은 것을 알 수 있습니다. 의도적으로 축소 변환을 만드는 경우 정적 캐스트를 사용하여 의도를 명시적으로 지정합니다. 그렇지 않으면 이 경고 메시지는 코드에 버그가 있음을 거의 항상 나타냅니다. 초기화한 개체에 입력을 처리할 수 있을 만큼 큰 형식이 있는지 확인하여 수정할 수 있습니다.
다음 샘플에서는 C4838을 생성하고 이를 해결하는 한 가지 방법을 보여 줍니다.
// C4838.cpp -- C++ narrowing conversion diagnostics
// Compile by using: cl /EHsc C4838.cpp
struct S1 {
int m1;
double m2, m3;
};
void function_C4838(double d1) {
double ad[] = { 1, d1 }; // OK
int ai[] = { 1, d1 }; // warning C4838
S1 s11 = { 1, 2, d1 }; // OK
S1 s12 { d1, 2, 3 }; // warning C4838
S1 s13 { static_cast<int>(d1), 2, 3 }; // possible fix for C4838
}