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을 컴파일 타임에 잡아낼 수 있다는 점이 유용하니 =, ()보다는 {}를 사용하는 습관을 가집시다.

반응형