검색결과 리스트
글
프로그래밍 일반
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; // 오류 : 줄어듬
RECENT COMMENT