implicit_conversion — 암묵적 변환

implicit_conversion — 암묵적 변환 (Implicit conversions)

**암묵적 변환(implicit conversion)**은 어떤 타입 T1의 표현식이 그 타입을 받지 않지만 다른 타입 T2를 받는 문맥에서 쓰일 때 수행되는 변환이에요.

프로그래머가 명시적으로 캐스트를 쓰지 않아도 컴파일러가 자동으로 수행해요. 편리하지만 때로는 의도와 다르게 동작해서 주의가 필요해요.

출처: cppreference

본문

암묵적 변환이 수행되는 대표적인 문맥은 다음과 같아요.

  • T2를 매개변수로 선언된 함수를 호출할 때 그 표현식을 인자로 쓰는 경우
  • T2를 기대하는 연산자의 피연산자로 쓰는 경우
  • T2 타입의 새 객체를 초기화할 때 (반환 값이 T2인 함수의 return 문 포함)
  • switch 문에서 (이때 T2는 정수 타입)
  • if 문이나 루프에서 (이때 T2bool)

프로그램은 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) — 정보를 잃지 않는 안전한 변환 (예: intlong, charint)
  • 축소 변환(narrowing conversion) — 정보를 잃을 수 있는 위험한 변환 (예: doubleint)
  • 사용자 정의 변환(user-defined conversion) — 생성자나 변환 연산자를 통한 변환
class MyBool {
public:
    operator bool() const { return true; }  // 암묵적 변환 연산자
};

피해야 할 함정: doubleint 같은 축소 변환은 데이터 손실이 있을 수 있어요. 목록 초기화(list initialization)에서는 축소 변환이 오류가 되기도 해요. 의도적인 변환에는 명시적 캐스트를 쓰는 게 안전해요.

더 알아보기 (Learn more)

cppreference