Casts

형변환 위험

C++의 cast는 모두 같은 변환이 아니다. 값 변환, 포인터 계층 변환, const 제거, 비트 재해석을 구분해야 실패 범위를 좁힐 수 있다.

01

변환 목적을 말한다

숫자 폭 조정인지, 기반/파생 이동인지, C API 경계인지에 따라 사용할 cast가 달라진다.

02

정보 손실 탐색

부호, 소수점, 포인터 정렬, 객체 실제 타입 같은 손실 지점을 변환 앞에서 확인한다.

03

형 변환 경계를 제한한다

cast는 넓게 퍼뜨리지 않고 외부 API나 직렬화 경계처럼 이유가 있는 위치에 둔다.

static
컴파일 시간 변환 숫자 변환과 명확한 상속 계층 변환에 사용한다.
런타임 타입 검사는 하지 않는다.
dynamic
런타임 타입 확인 다형 기반 클래스에서 실제 파생 타입을 검사한다.
실패 시 pointer는 null, reference는 예외다.
const
const 제거 원래 const 객체를 수정하면 정의되지 않은 동작이다.
API 결함 보정 외에는 피한다.
reinterpret
표현 재해석 객체 모델과 정렬 규칙을 직접 감수해야 한다.
portable code에서는 매우 좁게 쓴다.

C-style cast · 범위 · 다형성 점검

C-style cast 괄호형 cast가 여러 종류의 위험을 숨기고 있지 않은가.
범위 작은 정수 타입으로 줄이기 전에 값 범위를 확인했는가.
다형성 downcast가 필요하다면 기반 인터페이스 설계가 부족한 것은 아닌가.

의도가 보이는 변환

auto count = static_cast<std::size_t>(n);
if (auto* button = dynamic_cast<Button*>(widget)) {
    button->press();
}