language_static_cast
language_static_cast (static_cast 캐스팅)
암시적 변환과 사용자 정의 변환을 조합해 타입 사이를 변환해요. 컴파일 타임에 안전성이 검사되는 다운캐스트·업캐스트 등에 쓰이지만, 실행 시간 타입 검사는 하지 않아요.
출처: cppreference
본문
문법
static_cast<target-type>(expression)
타입 target-type의 값을 돌려줘요.
설명
const(또는 volatile)을 제거하는 변환이 아니라면 static_cast로 할 수 있는 변환은 다음과 같아요.
-
expression이 "cv1 Base" 타입의 lvalue이고target-type이 "cv2 Derived에 대한 참조"일 때, 다음 조건이 모두 만족하면 결과는expression을 포함하는Derived타입 객체를 가리켜요.
Derived는 완전 클래스 타입.Base는Derived의 기반 클래스.cv1이cv2보다 더 큰 cv-한정이 아님.
다음 조건 중 하나라도 만족하면 프로그램은 ill-formed예요.
Base가Derived의 가상 기반 클래스.Base가Derived의 가상 기반 클래스의 기반 클래스.- "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 객체의 하위 객체가 아님
-
expression이 "cv1 Derived에 대한 포인터" 타입의 prvalue이고target-type이 "cv2 Base에 대한 포인터"이며Base가Derived의 (가상이 아닌) 기반 클래스일 때, 결과는 적절한 기반 클래스 하위 객체를 가리켜요.
static_cast는 다운캐스트(downcast)에도 쓸 수 있지만 실행 시간 타입 확인을 하지 않아요. 대상 타입이 실제 객체와 맞지 않으면 미정의 동작이 될 수 있어요. 실행 시간에 안전한 다운캐스트가 필요하면 dynamic_cast를 써야 해요.