types_add_reference

types_add_reference (타입에 lvalue/rvalue 참조 추가하기)

이 페이지는 C++ 표준 라이브러리의 std::add_lvalue_referencestd::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&>::typeT&예요.
  • std::add_lvalue_reference<T&&>::typeT&예요.
  • std::add_rvalue_reference<T&>::typeT&예요.
  • std::add_rvalue_reference<T&&>::typeT&&예요.

T&를 직접 사용하는 것과의 주요 차이점은 std::add_lvalue_reference<void>::typevoid라는 거예요. 반면 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_cvstd::remove_reference를 결합해요 (클래스 템플릿) [edit]
add_lvalue_reference add_rvalue_reference (C++26) (C++26) 반영된 타입에 lvalue 또는 rvalue 참조를 추가해요 (함수) [edit]

더 알아보기 (Learn more)

cppreference