types_add_reference
types_add_reference (타입에 lvalue/rvalue 참조 추가하기)
이 페이지는 C++ 표준 라이브러리의 std::add_lvalue_reference와 std::add_rvalue_reference 타입 변환에 대해 설명해요. 이 템플릿들은 주어진 타입 T에 대해 lvalue 참조 또는 rvalue 참조 타입을 만들어 줘요. 참조를 만들 수 없는 경우에는 원래 타입을 그대로 사용해요.
출처: cppreference
본문
헤더 <type_traits>에 정의됨 |
||
|---|---|---|
template < class T > struct add_lvalue_reference ; |
(1) | (C++11부터) |
template < class T > struct add_rvalue_reference ; |
(2) | (C++11부터) |
T의 lvalue 또는 rvalue 참조 타입을 만들어요. 프로그램이 이 페이지에 설명된 템플릿 중 하나에 대해 특수화를 추가하면 동작이 정의되지 않아요.
멤버 타입
| 이름 | 정의 |
|---|---|
type |
T에 대한 참조, 또는 "T에 대한 참조"가 유효하지 않으면 T |
헬퍼 타입
template < class T > using add_lvalue_reference_t = typename add_lvalue_reference < T >:: type ; |
(C++14부터) | |
|---|---|---|
template < class T > using add_rvalue_reference_t = typename add_rvalue_reference < T >:: type ; |
(C++14부터) |
참고 사항
이 타입 변환들은 참조 축약(reference collapsing) 규칙을 따라요:
std::add_lvalue_reference<T&>::type은T&예요.std::add_lvalue_reference<T&&>::type은T&예요.std::add_rvalue_reference<T&>::type은T&예요.std::add_rvalue_reference<T&&>::type은T&&예요.
T&를 직접 사용하는 것과의 주요 차이점은 std::add_lvalue_reference<void>::type은 void라는 거예요. 반면 void&는 컴파일 오류를 일으켜요.
가능한 구현
namespace detail { template < class T > struct type_identity { using type = T ; }; // or use std::type_identity (since C++20) template < class T > // Note that `cv void&` is a substitution failure auto try_add_lvalue_reference ( int ) -> type_identity < T &> ; template < class T > // Handle T = cv void case auto try_add_lvalue_reference (...) -> type_identity < T > ; template < class T > auto try_add_rvalue_reference ( int ) -> type_identity < T &&> ; template < class T > auto try_add_rvalue_reference (...) -> type_identity < T > ; } // namespace detail template < class T > struct add_lvalue_reference : decltype ( detail :: try_add_lvalue_reference < T > ( 0 )) {}; template < class T > struct add_rvalue_reference : decltype ( detail :: try_add_rvalue_reference < T > ( 0 )) {};
예제
#include <type_traits>
int main()
{
using non_ref = int;
using l_ref = typename std::add_lvalue_reference_t<non_ref>;
static_assert(std::is_lvalue_reference_v<l_ref>);
using r_ref = typename std::add_rvalue_reference_t<non_ref>;
static_assert(std::is_rvalue_reference_v<r_ref>);
using void_ref = std::add_lvalue_reference_t<void>;
static_assert(!std::is_reference_v<void_ref>);
}
결함 보고서
다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었어요.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2101 | C++11 | 이 변환 특성들은 cv/ref 한정 함수 타입에 대한 참조를 생성해야 했어요. | cv/ref 한정 함수 타입 자체를 생성해요. |
같이 보기
is_reference (C++11) |
타입이 lvalue 참조 또는 rvalue 참조인지 검사해요 (클래스 템플릿) [edit] |
|---|---|
remove_reference (C++11) |
주어진 타입에서 참조를 제거해요 (클래스 템플릿) [edit] |
remove_cvref (C++20) |
std::remove_cv와 std::remove_reference를 결합해요 (클래스 템플릿) [edit] |
add_lvalue_reference add_rvalue_reference (C++26) (C++26) |
반영된 타입에 lvalue 또는 rvalue 참조를 추가해요 (함수) [edit] |