add_lvalue_reference_t <T>和T&之间的区别

Uro*_*327 10 c++ templates generic-programming c++11

假设您有一个模板参数T.

有什么区别

  • add_cv_t<T>const volatile T
  • add_const_t<T>const T
  • add_volatile_t<T>volatile T
  • add_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 T
  • add_const_t<T>const T
  • add_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>会给出一个指向参数实际类型的指针.