Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

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

NAME
       std::decay - std::decay

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

	  Performs  the	type conversions equivalent to the ones	performed when
       passing function
	  arguments by value. Formally:

	    * If T is "array of	U" or reference	to it, the member typedef type
       is U*.
	    * Otherwise, if T is a function type F or reference	 to  one,  the
       member typedef
	      type is std::add_pointer<F>::type.
	    * Otherwise, the member typedef type is
	      std::remove_cv<std::remove_reference<T>::type>::type.

	  If  the program adds specializations for std::decay, the behavior is
       undefined.

Member types
	  Name Definition
	  type the result of applying the decay	type conversions to T

Helper types
	  template< class T >			    (since C++14)
	  using	decay_t	= typename decay<T>::type;

Possible implementation
	  template<class T>
	  struct decay
	  {
	  private:
	      typedef typename std::remove_reference<T>::type U;
	  public:
	      typedef typename std::conditional<
		  std::is_array<U>::value,
		  typename	std::add_pointer<typename      std::remove_ex-
       tent<U>::type>::type,
		  typename std::conditional<
		      std::is_function<U>::value,
		      typename std::add_pointer<U>::type,
		      typename std::remove_cv<U>::type
		  >::type
	      >::type type;
	  };

Example
       // Run this code

	#include <type_traits>

	template<typename T, typename U>
	constexpr bool is_decay_equ = std::is_same_v<std::decay_t<T>, U>;

	int main()
	{
	    static_assert
	    (
		is_decay_equ<int, int> &&
		! is_decay_equ<int, float> &&
		is_decay_equ<int&, int>	&&
		is_decay_equ<int&&, int> &&
		is_decay_equ<const int&, int> &&
		is_decay_equ<int[2], int*> &&
		! is_decay_equ<int[4][2], int*>	&&
		! is_decay_equ<int[4][2], int**> &&
		is_decay_equ<int[4][2],	int(*)[2]> &&
		is_decay_equ<int(int), int(*)(int)>
	    );
	}

See also
	  remove_cvref	       combines	 std::remove_cv	and std::remove_refer-
       ence
	  (C++20)	      (class template)
	  implicit conversion array-to-pointer,	 function-to-pointer,  lvalue-
       to-rvalue
			      conversions

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

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::decay&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help