定义于头文件
<type_traits>
|
||
template< class T >
struct decay; |
(C++11 起) | |
对类型 T
应用左值到右值、数组到指针及函数到指针隐式转换,移除 cv 限定符,并定义结果类型为成员 typedef type
。正式而言:
T
指名“ U
的数组”或“到 U
的数组的引用”类型,则成员 typedef type
为 U* 。
T
为函数类型 F
或到它的引用,则成员 typedef type
为std::add_pointer<F>::type 。
type
为 std::remove_cv<std::remove_reference<T>::type>::type 。
这些转换模仿在以值传递时,应用到所有函数参数的类型转换。
目录 |
名称 | 定义 |
type
|
应用退化类型转换到 T 的结果
|
template< class T >
using decay_t = typename decay<T>::type; |
(C++14 起) | |
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::remove_extent<U>::type*, typename std::conditional< std::is_function<U>::value, typename std::add_pointer<U>::type, typename std::remove_cv<U>::type >::type >::type type; }; |
#include <iostream> #include <type_traits> template <typename T, typename U> struct decay_equiv : std::is_same<typename std::decay<T>::type, U>::type {}; int main() { std::cout << std::boolalpha << decay_equiv<int, int>::value << '\n' << decay_equiv<int&, int>::value << '\n' << decay_equiv<int&&, int>::value << '\n' << decay_equiv<const int&, int>::value << '\n' << decay_equiv<int[2], int*>::value << '\n' << decay_equiv<int(int), int(*)(int)>::value << '\n'; }
输出:
true true true true true true
(C++20)
|
将 std::remove_cv 与 std::remove_reference 结合 (类模板) |
隐式转换 | 数组到指针、函数到指针、左值到右值转换 |