std::convertible_to

std::convertible_to (변환 가능성 개념)

std::declval<From>()과 같은 타입과 값 범주를 가진 표현식이 To 타입으로 암시적·명시적 변환될 수 있고, 두 변환 형태가 같은 결과를 내는지를 명세하는 개념(concept)이에요. C++20부터 있어요.

출처: cppreference

본문

<concepts> 헤더에 정의돼 있어요.

template< class From, class To >
concept convertible_to =
    std::is_convertible_v<From, To> &&
    requires {
        static_cast<To>(std::declval<From>());
    };

개념 convertible_to<From, To>std::declval<From>()과 같은 타입·값 범주의 표현식이 To 타입으로 암시적이고 명시적으로 변환될 수 있으며, 두 변환 형태가 같은 결과를 산출함을 명세해요.

의미 요구사항

fun() 표현식이 동등성 보존인 타입 std::add_rvalue_reference_t<From>()의 함수 fun이 주어졌을 때 convertible_to<From, To>는 다음일 때만 모델링돼요.

  • 다음 중 하나:
    • To가 객체 타입도 아니고 객체에 대한 참조 타입도 아니다. 또는
    • static_cast<To>(fun())[]() -> To { return fun(); }()와 같다. 그리고
  • 다음 중 하나가 참:
    • std::add_rvalue_reference_t<From>이 객체에 대한 참조 타입이 아니다. 또는
    • std::add_rvalue_reference_t<From>이 비-const 한정 타입에 대한 rvalue 참조이고, fun()이 가리키는 객체의 결과 상태가 위 두 표현식 중 하나 이후 유효하지만 불특정하다. 또는
    • fun()이 가리키는 객체가 위 두 표현식 중 어느 것에도 수정되지 않는다.

동등성 보존

표준 라이브러리 개념의 requires 표현식에서 선언된 표현식들은 (달리 명시되지 않는 한) 동등성 보존이어야 해요.

convertible_to는 암시적 변환과 명시적 static_cast 변환이 동등한 결과를 내는지까지 확인하므로, 단순한 is_convertible보다 강한 요구사항을 포함해요. 제네릭 코드에서 타입 변환의 안전성을 보장할 때 널리 쓰여요.

참고 문헌

  • C++23 표준 (ISO/IEC 14882:2024): 18.4.4 Concept convertible_to [concept.convertible]
  • C++20 표준 (ISO/IEC 14882:2020): 18.4.4 Concept convertible_to [concept.convertible]

더 알아보기 (Learn more)

cppreference