types_bad_cast

types_bad_cast (bad_cast 예외 타입)

std::bad_castdynamic_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의 내용으로 내용을 대입해요. *thisother가 모두 동적 타입이 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

더 알아보기 (Learn more)

cppreference