参考资料
• cplusplus.com:
• cppreference.com:
std::decay简介
• 类模板声明
// cplusplus.comtemplatestruct decay; // MS C++ 2013 template struct decay { // determines decayed version of _Ty ... }; // GCC 4.8.2 template class decay { ... };
• 类模板说明
为类型T应用从左值到右值(lvalue-to-rvalue)、数组到指针(array-to-pointer)和函数到指针(function-to-pointer)的隐式转换。转换将移除类型T的cv限定符(const和volatile限定符),并定义结果类型为成员decay<T>::type的类型。这种转换很类似于当函数的所有参数按值传递时发生转换。
▶ 如果类型T是一个函数类型,那么从函数到指针的类型转换将被应用,并且T的衰变类型等同于:
add_pointer<T>::type
▶ 如果类型T是一个数组类型,那么从数组到指针的类型转换将被应用,并且T的衰变类型等同于:
add_pointer<remove_extent<remove_reference<T>::type>::type>::type
▶ 当左值到右值转换被应用时,T的衰变类型等同于:
remove_cv<remove_reference<T>::type>::type
• 模板参数说明
T : 某种类型。当T是引用类型,decay<T>::type返回T引用的元素类型;当T是非引用类型,decay<T>::type返回T的类型。
std::decay详解
• 基本类型
#include#include using namespace std;typedef decay ::type A; // A is inttypedef decay ::type B; // B is inttypedef decay ::type C; // C is inttypedef decay ::type D; // D is inttypedef decay ::type E; // E is int *typedef decay ::type F; // F is int(*)(int)int main() { cout << boolalpha; cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true cout << is_same ::value << endl; // false cout << is_same ::value << endl; // true return 1;}
• 非基本类型
#include#include using namespace std;class MyClass {};typedef decay ::type A; // A is MyClasstypedef decay ::type B; // B is MyClasstypedef decay ::type C; // C is MyClasstypedef decay ::type D; // D is MyClasstypedef decay ::type E; // E is MyClass *typedef decay ::type F; // E is MyClass *typedef decay ::type G; // G is MyClass **typedef decay ::type H; // H is MyClass **int main() { cout << boolalpha; cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true cout << is_same ::value << endl; // true return 1;}