Difference between add_lvalue_reference_t<T> and T&
Difference between add_lvalue_reference_t<T> and T&
假设您有一个模板参数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>
和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
为cv void
时, T&
和T&&
是病态的,但这些模板是格式良好的,只是返回原始类型。
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>
会给出一个指向实参实际类型的指针。
根据我在STL源代码中看到的:
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&
-有区别,例如,如果T是不可引用的类型void。add_lvalue_reference_t<void>::type = void
和void&
=编译时错误
add_rvalue_reference_t<T>
和T&&
-同上
add_pointer_t<T>
和T*
-当T是引用时的差异,因为没有指向引用的指针。add_pointer_t<T>
相当于std::remove_reference<T>::type*
大多数情况下,std::add_rvalue_reference_t<T>
等同于T&&
。但是,如果不考虑引用折叠规则和指定哪些类型是可引用的规则,可能会使您的代码出错。
T
是不可引用的类型,type
静态成员类型会有所不同。例如,std::add_rvalue_reference_t<void>
解析为void
,并且(以您提到的另一个模板为例)std::add_pointer_t<T&>
解析为T*
(如果您想调用混乱,所需的仪式是std::add_pointer_t<std::add_rvalue_reference_t<void>>
:))
就用途而言,它可能被用作模板模板参数来做一些奇怪的黑魔法。无论如何,std::is_rvalue_reference_t<T>
或std::remove_reference_t<T>
之类的东西在操作类型的引用属性时通常更常用。
- EASTL矢量<向量<int>>连续的
- 在 C++ AMP 数组中复制数据多少次?
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- 用户输入N,找到所有a和b共素数对,其中a<;N&;b<;N
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- ``这个''不能用this-&gt;指针变量
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 在Linux下的C 程序中包括AMP.H LIB
- 是std :: set&lt; std :: future&gt;不可能存在