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

NAME
     std::is_reference - std::is_reference

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

	std::is_reference is a UnaryTypeTrait.

	If  T  is  a reference type (lvalue reference or rvalue reference), pro-
     vides the member
	constant value equal true. For any other type, value is false.

	If  the  program   adds   specializations   for   std::is_reference   or
     std::is_reference_v,
	the behavior is undefined.

Template parameters
	T - a type to check

	Helper variable template

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

     Inherited from std::integral_constant

Member constants
	value	 true if T is a 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_reference : std::false_type {};
	template<class T> struct is_reference<T&> : std::true_type {};
	template<class T> struct is_reference<T&&> : std::true_type {};

Example
     // Run this code

      #include <iostream>
      #include <type_traits>

      class A {};

      int main()
      {
      #   define REF(x) << #x " ?: " << x << '\n'
	  std::cout << std::boolalpha
	  REF(std::is_reference_v<A>)
	  REF(std::is_reference_v<A&>)
	  REF(std::is_reference_v<A&&>)
	  REF(std::is_reference_v<long>)
	  REF(std::is_reference_v<long&>)
	  REF(std::is_reference_v<long&&>)
	  REF(std::is_reference_v<double*>)
	  REF(std::is_reference_v<double*&>)
	  REF(std::is_reference_v<double*&&>);
      #   undef REF
      }

Output:
      std::is_reference_v<A> ?: false
      std::is_reference_v<A&> ?: true
      std::is_reference_v<A&&> ?: true
      std::is_reference_v<long> ?: false
      std::is_reference_v<long&> ?: true
      std::is_reference_v<long&&> ?: true
      std::is_reference_v<double*> ?: false
      std::is_reference_v<double*&> ?: true
      std::is_reference_v<double*&&> ?: true

See also
	is_lvalue_reference checks if a type is an lvalue reference
	(C++11) 	    (class template)
	is_rvalue_reference checks if a type is an rvalue reference
	(C++11) 	    (class template)

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

home | help