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::conditiona...
如果类型T是一个左值引用或右值引用,那么std::decay::type就是T的基础类型。例如,如果T是int&或int&&,那么std::decay::type就是int。 如果类型T是一个带有常量或易变性限定符的类型,那么std::decay::type就是T的非常量、非易变性类型。例如,如果T是const int或volatile int,那么std::decay::type就是int。
否则,若T为函数类型F或到它的引用,则成员 typedeftype为std::add_pointer<F>::type。 否则,成员 typedeftype为std::remove_cv<std::remove_reference<T>::type>::type。 这些转换模仿在以值传递时,应用到所有函数参数的类型转换。 添加decay的特化的程序行为未定义。
using _Tuple = tuple<decay_t<_Fn>, decay_t<_Args>...>; //将传入thread的所有参数保存着tuple //在堆上创建tuple以按值保存thread所有参数的副本,指针用unique_ptr来管理。 auto _Decay_copied = _STD make_unique<_Tuple>(_STD forward<_Fn>(_Fx), _STD forward<_Args>(_Ax)...); //创建t...
为类型T应用从左值到右值(lvalue-to-rvalue)、数组到指针(array-to-pointer)和函数到指针(function-to-pointer)的隐式转换。转换将移除类型T的cv限定符(const和volatile限定符),并定义结果类型为成员decay<T>::type的类型。这种转换很类似于当函数的所有参数按值传递时发生转换。
为类型T应用从左值到右值(lvalue-to-rvalue)、数组到指针(array-to-pointer)和函数到指针(function-to-pointer)的隐式转换。转换将移除类型T的cv限定符(const和volatile限定符),并定义结果类型为成员decay<T>::type的类型。这种转换很类似于当函数的所有参数按值传递时发生转换。
当该bool变量为false时调用full_decay<>的false偏特化版本, false偏特化版本继承自身,并用remove_pointer_decay<T>后的类型填充自身模板类型T,通过递归继承,直到remove_pointer_decay<T>类型与T类型完全相同时调用true偏特化版本,在true偏特化版本中定义type方便调用...所有的递归调用过程均在编译期完成,从这个例子中...
std::decay定义于头文件 <type_traits> template< class T > struct decay; (C++11 起) 对类型 T 应用左值到右值、数组到指针及函数到指针隐式转换,移除 cv 限定符,并定义结果类型为成员 typedef type 。正式而言: 若T 指名“ U 的数组”或“到 U 的数组的引用”类型,则成员 typedef type 为U*...
using T = std::decay_t<decltype(arg)>; if constexpr (std::is_same_v<T, int>) { std::cout << "arg is an integer with value: " << arg << '\n'; } else if constexpr (std::is_same_v<T, float>) { std::cout << "arg is a float with value: " << arg << '\n';...
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_extent<U>::type>::type, typename std::conditional< std::is_function<U>::valu...