language_static_cast

language_static_cast (static_cast 캐스팅)

암시적 변환과 사용자 정의 변환을 조합해 타입 사이를 변환해요. 컴파일 타임에 안전성이 검사되는 다운캐스트·업캐스트 등에 쓰이지만, 실행 시간 타입 검사는 하지 않아요.

출처: cppreference

본문

문법

static_cast<target-type>(expression)

타입 target-type의 값을 돌려줘요.

설명

const(또는 volatile)을 제거하는 변환이 아니라면 static_cast로 할 수 있는 변환은 다음과 같아요.

    1. expression이 "cv1 Base" 타입의 lvalue이고 target-type이 "cv2 Derived에 대한 참조"일 때, 다음 조건이 모두 만족하면 결과는 expression을 포함하는 Derived 타입 객체를 가리켜요.
    • Derived는 완전 클래스 타입.
    • BaseDerived의 기반 클래스.
    • cv1cv2보다 더 큰 cv-한정이 아님.

    다음 조건 중 하나라도 만족하면 프로그램은 ill-formed예요.

    • BaseDerived의 가상 기반 클래스.
    • BaseDerived의 가상 기반 클래스의 기반 클래스.
    • "Derived에 대한 포인터"에서 "Base에 대한 포인터"로 유효한 표준 변환이 없음.

    expression이 실제로 Derived 타입 객체의 기반 클래스 하위 객체가 아니면 동작은 미정의예요.

struct B {};
struct D : B { B b; };

D d;
B& b = d;              // ok
B& b2 = d.b;           // d.b 는 B 하위 객체
D& dr = static_cast<D&>(b);  // ok
// D& dr2 = static_cast<D&>(b2);  // UB: b2 는 실제 D 객체의 하위 객체가 아님
    1. expression이 "cv1 Derived에 대한 포인터" 타입의 prvalue이고 target-type이 "cv2 Base에 대한 포인터"이며 BaseDerived의 (가상이 아닌) 기반 클래스일 때, 결과는 적절한 기반 클래스 하위 객체를 가리켜요.

static_cast는 다운캐스트(downcast)에도 쓸 수 있지만 실행 시간 타입 확인을 하지 않아요. 대상 타입이 실제 객체와 맞지 않으면 미정의 동작이 될 수 있어요. 실행 시간에 안전한 다운캐스트가 필요하면 dynamic_cast를 써야 해요.

더 알아보기 (Learn more)

cppreference