프로그래밍 일반 2014. 4. 10. 11:13

C++ 11 줄어듬 narrowing 방지

웹 컴파일러 링크 : http://melpon.org/wandbox/


C와 C++의 문제점으로 아래와 같은 것을 암시적으로 잘라낸다.


int x = 7.3; // 데이터 손실

void f(int);

f(7.3); // 데이터 손실


하지만 C++ 11 에서 {} 초기화는 이와 같은 narrowing cast 를 허용하지 않는다.



int x0 {7.3}; // 오류 : 줄어듬

int x1 = {7.3}; // 오류 : 줄어듬

double d = 7;

int x2{d}; // 오류 : 줄어듬 (double 에서 int 로)

char x3{7}; // 가능 : 7 이 비록 int 이지만 이는 줄어듬이 아니다

vector<int> vi = { 1, 2.3, 4, 5.6 }; // 오류 : double 에서 int 로 줄어듬


C++ 11 이 많은 수의 호환성 문제를 방지할 수 있는 이유는 바로 가능한 초기화자의 타입이 아닌 실제 값을 비교해서 줄으듬인지 아닌지 판단하기 때문이다. 만일 어떠한 값이 목표한 타입과 정확히 동일하게 같은 값으로 표현할 수 있다면 그 타입 변환은 줄어듬이 아니다.


char c1{7}; // 7 은 int 이지만 char 에 포함되므로 가능하다

char c2{77777}; // 오류 : 줄어듬


부동 소수점 - 정수 간 변환은 언제나 줄어듬으로 판단한다. 


int ivalue = 7.0; // 오류 : 줄어듬