types_bad_cast
types_bad_cast (bad_cast 예외 타입)
std::bad_cast는 dynamic_cast를 참조 타입에 적용할 때 런타임 검사가 실패하면 던져지는 예외 타입이에요. 또한 std::use_facet에서 요청한 facet이 로캘에 존재하지 않을 때도 이 예외가 발생해요. 이 페이지에서는 bad_cast의 생성자, 대입 연산자, what() 멤버 함수에 대해 자세히 설명할게요.
출처: cppreference
본문
개요
<typeinfo> 헤더에 정의되어 있으며, std::exception을 공개 상속해요.
<typeinfo> 헤더에 정의됨 |
||
|---|---|---|
| class bad_cast : public std::exception; |
이 예외는 dynamic_cast를 참조 타입으로 수행할 때 런타임 검사가 실패하면 던져져요. 예를 들어 타입들이 상속 관계로 연결되어 있지 않은 경우가 여기에 해당해요. 또한 std::use_facet에서 요청한 facet이 로캘에 존재하지 않을 때도 이 예외가 발생해요.
상속 다이어그램은 다음과 같아요.
std::exception
↑
std::bad_cast
멤버 함수
| (생성자) | 새로운 bad_cast 객체를 생성해요 (공개 멤버 함수) |
|---|---|
| operator= | bad_cast 객체를 대체해요 (공개 멤버 함수) |
| what | 설명 문자열을 반환해요 (공개 멤버 함수) |
std::bad_cast::bad_cast
| bad_cast() throw(); | (1) | (C++11까지) |
|---|---|---|
| bad_cast() noexcept; | (C++11부터) | |
| bad_cast(const bad_cast& other) throw(); | (2) | (C++11까지) |
| bad_cast(const bad_cast& other) noexcept; | (C++11부터) |
what()을 통해 접근할 수 있는 구현 정의된 널 종료 바이트 문자열로 새 bad_cast 객체를 생성해요.
매개변수
| other | - | 복사할 다른 예외 객체 |
|---|
std::bad_cast::operator=
| bad_cast& operator=(const bad_cast& other) throw(); | (C++11까지) | |
|---|---|---|
| bad_cast& operator=(const bad_cast& other) noexcept; | (C++11부터) |
other의 내용으로 내용을 대입해요. *this와 other가 모두 동적 타입이 std::bad_cast라면, 대입 후 std::strcmp(what(), other.what()) == 0이 성립해요. (C++11부터)
매개변수
| other | - | 대입할 다른 예외 객체 |
|---|
반환값
*this
std::bad_cast::what
| virtual const char* what() const throw(); | (C++11까지) | |
|---|---|---|
| virtual const char* what() const noexcept; | (C++11부터) (C++26부터 constexpr) |
설명 문자열을 반환해요.
반환값
설명 정보가 담긴 구현 정의된 널 종료 문자열에 대한 포인터를 반환해요. 이 문자열은 std::wstring으로 변환 및 표시하기에 적합해요. 포인터는 예외 객체가 소멸되거나, 예외 객체에 대해 비-const 멤버 함수(예: 복사 대입 연산자)가 호출될 때까지 유효함이 보장돼요.
| 반환된 문자열은 상수 평가 중에 일반 리터럴 인코딩으로 인코딩돼요. | (C++26부터) |
|---|
참고
구현은 what()을 재정의할 수 있지만 필수는 아니에요.
std::exception에서 상속받은 멤버
멤버 함수
| (소멸자) [virtual] | 예외 객체를 소멸해요 (std::exception의 가상 공개 멤버 함수) |
|---|---|
| what [virtual] | 설명 문자열을 반환해요 (std::exception의 가상 공개 멤버 함수) |
참고
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
| __cpp_lib_constexpr_exceptions | 202411L | (C++26) | 예외 타입에 대한 constexpr |
예제
#include <iostream>
#include <typeinfo>
struct Foo { virtual ~Foo() {} };
struct Bar { virtual ~Bar() { std::cout << "~Bar\n"; } };
struct Pub : Bar { ~Pub() override { std::cout << "~Pub\n"; } };
int main()
{
Pub pub;
try
{
Bar& r1 = dynamic_cast<Bar&>(pub); // OK, upcast
Foo& r2 = dynamic_cast<Foo&>(pub); // throws
}
catch (const std::bad_cast& e)
{
std::cout << "e.what(): " << e.what() << '\n';
}
}
가능한 출력:
e.what(): std::bad_cast
~Pub
~Bar