implicit_conversion — 암묵적 변환
implicit_conversion — 암묵적 변환 (Implicit conversions)
**암묵적 변환(implicit conversion)**은 어떤 타입 T1의 표현식이 그 타입을 받지 않지만 다른 타입 T2를 받는 문맥에서 쓰일 때 수행되는 변환이에요.
프로그래머가 명시적으로 캐스트를 쓰지 않아도 컴파일러가 자동으로 수행해요. 편리하지만 때로는 의도와 다르게 동작해서 주의가 필요해요.
출처: cppreference
본문
암묵적 변환이 수행되는 대표적인 문맥은 다음과 같아요.
T2를 매개변수로 선언된 함수를 호출할 때 그 표현식을 인자로 쓰는 경우T2를 기대하는 연산자의 피연산자로 쓰는 경우T2타입의 새 객체를 초기화할 때 (반환 값이T2인 함수의return문 포함)switch문에서 (이때T2는 정수 타입)if문이나 루프에서 (이때T2는bool)
프로그램은 T1에서 T2로 가는 **모호하지 않은 암묵적 변환 시퀀스(implicit conversion sequence)**가 하나 존재할 때만 정상적으로 컴파일돼요.
double d = 3.14;
int n = d; // double → int: 소수부 잘림 (0.14 손실)
long l = 42;
double e = l; // long → double
bool b = 10; // int → bool: 0이 아니면 true
char c = 'A';
int code = c; // char → int (승격)
주요 변환의 종류는 다음과 같아요.
- 표준 변환(standard conversion) — 숫자 승격(promotion), 숫자 변환(conversion), 포인터 변환 등
- 승격(promotion) — 정보를 잃지 않는 안전한 변환 (예:
int→long,char→int) - 축소 변환(narrowing conversion) — 정보를 잃을 수 있는 위험한 변환 (예:
double→int) - 사용자 정의 변환(user-defined conversion) — 생성자나 변환 연산자를 통한 변환
class MyBool {
public:
operator bool() const { return true; } // 암묵적 변환 연산자
};
피해야 할 함정: double → int 같은 축소 변환은 데이터 손실이 있을 수 있어요. 목록 초기화(list initialization)에서는 축소 변환이 오류가 되기도 해요. 의도적인 변환에는 명시적 캐스트를 쓰는 게 안전해요.