types_is_rvalue_reference

types_is_rvalue_reference (rvalue 참조 타입 판별)

std::is_rvalue_reference는 주어진 타입 T가 rvalue 참조 타입인지 여부를 컴파일 타임에 판별하는 타입 특질(trait)이에요. 이 특질을 사용하면 템플릿 메타프로그래밍에서 타입의 종류를 조건부로 분기할 수 있어요. C++11부터 사용할 수 있고, C++17부터는 is_rvalue_reference_v 변수 템플릿을 통해 더 간결하게 접근할 수 있어요.

출처: cppreference

본문

<type_traits> 헤더에 정의되어 있으며, T가 rvalue 참조 타입(T&&)인 경우 valuetrue가 되고, 그 외의 경우 false가 돼요. 만약 프로그램에서 std::is_rvalue_reference 또는 std::is_rvalue_reference_v에 대한 특수화를 추가하면 동작이 정의되지 않아요.

템플릿 매개변수

T - 확인할 타입

헬퍼 변수 템플릿

template < class T > constexpr bool is_rvalue_reference_v = is_rvalue_reference < T >:: value ;

C++17부터 사용할 수 있어요.

std::integral_constant에서 상속받은 멤버

멤버 상수

value [static] T가 rvalue 참조 타입이면 true, 아니면 false (공용 정적 멤버 상수)

멤버 함수

operator bool 객체를 bool로 변환하며, value를 반환해요 (공용 멤버 함수)
operator() (C++14) value를 반환해요 (공용 멤버 함수)

멤버 타입

Type Definition
value_type bool
type std::integral_constant<bool, value>

가능한 구현

template < class T > struct is_rvalue_reference : std :: false_type {};
template < class T > struct is_rvalue_reference < T &&> : std :: true_type {};

예제

#include <iostream>
#include <type_traits>
 
class A {};
 
static_assert
(
    std::is_rvalue_reference_v<A> == false and
    std::is_rvalue_reference_v<A&> == false and
    std::is_rvalue_reference_v<A&&> != false and
    std::is_rvalue_reference_v<char> == false and
    std::is_rvalue_reference_v<char&> == false and
    std::is_rvalue_reference_v<char&&> != false
);

template <typename T>
void test(T&& x)
{
    static_assert(std::is_same_v<T&&, decltype(x)>);
    std::cout << "T\t" << std::is_rvalue_reference<T>::value << '\n';
    std::cout << "T&&\t" << std::is_rvalue_reference<T&&>::value << '\n';
    std::cout << "decltype(x)\t" << std::is_rvalue_reference<decltype(x)>::value << '\n';
}

int main()
{
    std::cout << std::boolalpha;
    std::cout << "A\t" << std::is_rvalue_reference<A>::value << '\n';
    std::cout << "A&\t" << std::is_rvalue_reference<A&>::value << '\n';
    std::cout << "A&&\t" << std::is_rvalue_reference<A&&>::value << '\n';
    std::cout << "char\t" << std::is_rvalue_reference<char>::value << '\n';
    std::cout << "char&\t" << std::is_rvalue_reference<char&>::value << '\n';
    std::cout << "char&&\t" << std::is_rvalue_reference<char&&>::value << '\n';

    std::cout << "\ntest(42)\n";
    test(42);

    std::cout << "\ntest(x)\n";
    int x = 42;
    test(x);
}

출력:

A	false
A&	false
A&&	true
char	false
char&	false
char&&	true

test(42)
T	false
T&&	true
decltype(x)	true

test(x)
T	false
T&&	false
decltype(x)	false

같이 보기

is_lvalue_reference (C++11) 타입이 lvalue 참조인지 확인해요 (클래스 템플릿)
is_reference (C++11) 타입이 lvalue 참조 또는 rvalue 참조인지 확인해요 (클래스 템플릿)
is_rvalue_reference_type (C++26) 리플렉션이 rvalue 참조를 나타내는지 확인해요 (함수)

더 알아보기 (Learn more)

cppreference