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&&)인 경우 value가 true가 되고, 그 외의 경우 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 참조를 나타내는지 확인해요 (함수) |