std::is_rvalue_reference - cppreference.com

From cppreference.com

template< class T > struct is_rvalue_reference;

(since C++11)

std::is_rvalue_reference is a UnaryTypeTrait.

Checks whether T is an rvalue reference type. Provides the member constant value which is equal to true, if T is an rvalue reference type. Otherwise, value is equal to false.

If the program adds specializations for std::is_rvalue_reference or std::is_rvalue_reference_v, the behavior is undefined.

Template parameters

Helper variable template

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

(since C++17)

Inherited from std::integral_constant

Member constants

true if T is an rvalue reference type, false otherwise
(public static member constant)

Member functions

converts the object to bool, returns value
(public member function)
returns value
(public member function)

Member types

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

Possible implementation

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

Example

#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);
}

Output:

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

See also