home | help
std::is_rvalue_reference(3)    C++ Standard Libary   std::is_rvalue_reference(3)

NAME
     std::is_rvalue_reference - std::is_rvalue_reference

Synopsis
	Defined in header <type_traits>
	template< class T >		 (since C++11)
	struct is_rvalue_reference;

	std::is_rvalue_reference is a UnaryTypeTrait.

	Checks	whether  T is an rvalue reference type. Provides the member con-
     stant 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
	T - a type to check

	Helper variable template

	template< class T >
	inline	      constexpr        bool	   is_rvalue_reference_v       =
     (since C++17)
	is_rvalue_reference<T>::value;

     Inherited from std::integral_constant

Member constants
	value	 true if T is an rvalue reference type, false otherwise
	[static] (public static member constant)

Member functions
	operator bool converts the object to bool, returns value
		      (public member function)
	operator()    returns value
	(C++14)       (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
     // Run this code

      #include <type_traits>
      #include <iostream>

      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<de-
     cltype(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
	is_lvalue_reference checks if a type is an lvalue reference
	(C++11) 	    (class template)
	is_reference	    checks if a type is either an  lvalue  reference  or
     rvalue
	(C++11) 	    reference
			    (class template)

http://cppreference.com 	   2024.06.10	     std::is_rvalue_reference(3)

home | help