std::decay - cppreference.com (original) (raw)
| | | | | ---------------------------------- | | ------------- | | template< class T > struct decay; | | (since C++11) |
Performs the type conversions equivalent to the ones performed when passing function arguments by value. Formally:
- If
T
is “array ofU
” or reference to it, the member typedeftype
isU*
. - Otherwise, if
T
is a function typeF
or reference to one, the member typedeftype
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.
[edit] Member types
Name | Definition |
---|---|
type | the result of applying the decay type conversions to T |
[edit] Helper types
| template< class T > using decay_t = typename decay<T>::type; | | (since C++14) | | ---------------------------------------------------------------- | | ------------- |
[edit] Possible implementation
[edit] Example
#include template<typename T, typename U> constexpr bool is_decay_equ = std::is_same_v<std::decay_t, U>; 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)> ); int main() {}