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]