C++11부터 list initialization을 사용할 수 있는데요, list initialization을 할 때는 implicit conversion(암시적 형 변환)이 일어날 때 아래에 해당되면 컴파일 에러를 내서 narrowing conversion(축소 변환)을 막게 됩니다.
(레퍼런스 Narrowing conversions 챕터 참조)
- floating-point type --> integer type
- long double --> (double 또는 float)
double --> float
(source가 constexpr이면서 변환시 overflow가 일어나지 않으면 변환 가능) - integer type --> floating type
(source가 constexpr이면서 변환시 loss of precision이 일어나지 않으면 변환 가능) - ...등등
int a1 = 3.0; // OK: Narrowing
int a2(3.0); // OK: Narrowing
int b1 {2}; // OK
int b2 {2.0}; // Error: Narrowing (Double -> int)
char c1 {127}; // OK
char c2 {128}; // Error: Narrowing (char 범위 초과)
예시입니다.
컴파일러에 따라 warning만 나올 수도 있는데, narrowing conversion시 에러를 띄우려면 컴파일 시 -pedantic-errors
또는 -Werror=narrowing
옵션을 추가해줘야 합니다.
list intialization은 implicit conversion 과정에서 의도치 않은 narrowing conversion을 컴파일 타임에 잡아낼 수 있다는 점이 유용하니 =, ()보다는 {}를 사용하는 습관을 가집시다.
반응형
'프로그래밍 > C++' 카테고리의 다른 글
C++ std::thread (0) | 2020.07.25 |
---|---|
C++ std::unique_ptr 2차원 배열 만들기 (0) | 2020.07.17 |
C++ 배열의 값이 전부 같은지 확인하는 방법 (std::equal) (0) | 2020.06.20 |
intrinsic popcount, clz, ctz (gcc, msvc) (2) | 2020.06.09 |
C++ memset으로 배열 초기화 시 주의점 (0) | 2020.05.22 |