c++ - add_lvalue_reference_t<T> 和 T& 之间的区别

标签 c++ templates c++11 generic-programming

假设您有一个模板参数 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&&例如。什么时候选择哪个有什么规则吗?

最佳答案

  • add_cv_t<T> and const volatile T
  • add_const_t<T> and const T
  • add_volatile_t<T> and volatile T

没有区别; add_const<T>::type的定义|只是T const ,例如。

  • add_lvalue_reference_t<T> and T&
  • add_rvalue_reference_t<T> and T&&

T&T&&T 时是病式的是简历 void , 但这些模板格式正确,只是返回原始类型。

  • add_pointer_t<T> and T*?

add_pointer_t<T>相当于std::remove_reference<T>::type* .也就是说,如果 T是引用类型,它给出了指向引用类型的指针。另一方面,T*将是错误格式的,因为您不能拥有指向引用的指针。

你应该使用哪个?

  • 通常,别名模板可用于防止扣除T。 .当然,也就是说,如果你要减分,你就应该避开它们。
  • 别名模板可以用作将类型转换作为参数的模板的模板模板参数。
  • 别名模板的行为不同于 T* 等替代方案在通用代码中很有用,因为它们“做正确的事”。例如,如果 TT&& 类型的参数推导出来, 然后 T*当参数是左值时做错事,因为它试图声明一个指向左值引用的指针。但是std::add_pointer_t<T>将给出一个指向参数实际类型的指针。

关于c++ - add_lvalue_reference_t<T> 和 T& 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32147265/

相关文章:

c++ - 在 Visual Studio 2012 C++ 项目中嵌入 Python

具有右值引用的 C++ 构造函数

opencv - 确定数据类型并用作模板类型名

c++ - 用模板复制构造函数替换默认复制构造函数

c++ - 在将对象传递给函数期间删除复制/移动构造函数和赋值运算符后没有出现编译时错误

c++ - 在函数中访问类的数组

C++双向链表打印

javascript - 如何在 ng-view (angularjs) 中使用常规 javascript 代码

c++ - 推断/删除模板模板参数的类型

c++ - 为什么libstdc++-v3中declval的实现看起来那么复杂?