Uro*_*327 10 c++ templates generic-programming c++11
假设您有一个模板参数T.
有什么区别
add_cv_t<T> 和 const volatile Tadd_const_t<T> 和 const Tadd_volatile_t<T> 和 volatile Tadd_lvalue_reference_t<T> 和 T&add_rvalue_reference_t<T> 和 T&&add_pointer_t<T>和T*?我为什么要用add_rvalue_reference_t<T>而不是T&&举个例子.有什么规则可供选择吗?
Bri*_*ian 14
add_cv_t<T>和const volatile Tadd_const_t<T>和const Tadd_volatile_t<T>和volatile T
没有不同; 例如,定义add_const<T>::type就是T const.
add_lvalue_reference_t<T>和T&add_rvalue_reference_t<T>和T&&
T&和T&&被虐待时形成T的品种 void,但这些模板是良好的,只是给原来的类型了.
add_pointer_t<T>和T*?
add_pointer_t<T>相当于std::remove_reference<T>::type*.也就是说,如果T是引用类型,它会给出一个指向引用类型的指针.另一方面,T*由于您不能有指向引用的指针,因此格式不正确.
你应该用哪个?
T.当然,这意味着如果你想要扣除,你应该避免它们.T*在通用代码中很有用,因为它们"做正确的事".例如,如果T从类型的参数推断出来T&&,那么T*当参数是左值时,它会做错误的事情,因为它试图声明一个指向左值引用的指针.但是std::add_pointer_t<T>会给出一个指向参数实际类型的指针.