types_reference_converts_from_temporary
types_reference_converts_from_temporary (임시 객체로부터 참조 변환 여부를 확인하는 타입 특성)
이 페이지는 C++23에서 도입된 std::reference_converts_from_temporary 타입 특성에 대해 설명해요. 이 특성은 복사 초기화에서 참조 타입이 임시 객체를 바인딩할 수 있는지 컴파일 타임에 판별해 줘요. 주로 항상 댕글링 참조를 만드는 코드를 거부하는 데 유용해요.
출처: cppreference
본문
정의
From이 스칼라 타입이거나 cv void라면 V는 std::remove_cv_t<From>이고, 그 외의 경우에는 V는 From이에요. To가 참조 타입이고, decltype(e)가 V가 되는 가상의 표현식 e가 주어졌을 때, 변수 정의 To ref = e;가 유효하고 임시 객체를 ref에 바인딩한다면, 멤버 상수 value는 true가 돼요. 그렇지 않으면 value는 false예요.
To가 const 한정(비휘발성) 객체 타입에 대한 lvalue 참조 타입이거나 rvalue 참조 타입이라면, std::remove_reference_t<To>와 std::remove_reference_t<From>은 모두 완전 타입, cv void, 또는 크기를 알 수 없는 배열이어야 해요. 그렇지 않으면 동작이 정의되지 않아요.
위 템플릿의 인스턴스화가 직접 또는 간접적으로 불완전 타입에 의존하고, 해당 타입이 가상적으로 완전해질 때 인스턴스화 결과가 달라질 수 있다면 동작이 정의되지 않아요.
프로그램이 std::reference_converts_from_temporary 또는 std::reference_converts_from_temporary_v에 대한 특수화를 추가하면 동작이 정의되지 않아요.
헬퍼 변수 템플릿
| 템플릿 | ||
|---|---|---|
template < class To , class From > constexpr bool reference_converts_from_temporary_v = std :: reference_converts_from_temporary < To , From >:: value ; |
(C++23부터) |
std::integral_constant로부터 상속됨
멤버 상수
| 멤버 상수 | 설명 |
|---|---|
value [static] |
To가 참조 타입이고, From 값이 복사 초기화에서 To에 바인딩될 수 있으며, 임시 객체가 참조에 바인딩되는 경우 true, 그 외에는 false (공용 정적 멤버 상수) |
멤버 함수
| 멤버 함수 | 설명 |
|---|---|
operator bool |
객체를 bool로 변환하고 value를 반환해요 (공용 멤버 함수) |
operator() (C++14) |
value를 반환해요 (공용 멤버 함수) |
멤버 타입
| 타입 | 정의 |
|---|---|
value_type |
bool |
type |
std :: integral_constant < bool , value > |
Notes
std::reference_converts_from_temporary는 항상 댕글링 참조를 생성하는 일부 경우를 거부하는 데 사용할 수 있어요.
예제
다음 예제는 이 타입 특성이 어떻게 동작하는지 보여줘요.
#include <type_traits>
static_assert
(""
&& std::reference_converts_from_temporary_v<int&&, int> == true
&& std::reference_converts_from_temporary_v<const int&, int> == true
&& std::reference_converts_from_temporary_v<int&&, int&&> == false
&& std::reference_converts_from_temporary_v<const int&, int&&> == false
&& std::reference_converts_from_temporary_v<int&&, long&&> == true
&& std::reference_converts_from_temporary_v<int&&, long> == true
);
int main() {}
같이 보기
| is_convertible is_nothrow_convertible (C++11) (C++20) | 한 타입이 다른 타입으로 변환될 수 있는지 확인해요 (클래스 템플릿) [edit] |
|---|---|
| invoke invoke_r (C++17) (C++23) | 주어진 인자로 Callable 객체를 호출하고 반환 타입을 지정할 수 있어요 (C++23부터) (함수 템플릿) [edit] |
| bind (C++11) | 하나 이상의 인자를 함수 객체에 바인딩해요 (함수 템플릿) [edit] |
| visit (C++17) | 하나 이상의 variant가 보관한 인자로 제공된 펑터를 호출해요 (함수 템플릿) [edit] |
| (constructor) | 새로운 std::function 인스턴스를 생성해요 (std::function<R(Args...)>의 공용 멤버 함수) [edit] |
| (constructor) | 새로운 std::move_only_function 객체를 생성해요 (std::move_only_function의 공용 멤버 함수) [edit] |
| (constructor) | 작업 객체를 생성해요 (std::packaged_task<R(Args...)>의 공용 멤버 함수) [edit] |
| reference_constructs_from_temporary (C++23) | 직접 초기화에서 참조가 임시 객체에 바인딩되는지 확인해요 (클래스 템플릿) [edit] |
| reference_converts_from_temporary (C++26) | 복사 초기화에서 참조가 임시 객체에 바인딩되는지 확인해요 (함수) [edit] |