add_rvalue_reference 类
如果模板参数是对象或函数类型,则创建模板参数的右值引用类型。 否则,由于引用折叠的语义,类型与模板参数相同。
语法
template <class T>
struct add_rvalue_reference;
template <class T>
using add_rvalue_reference_t = typename add_rvalue_reference<T>::type;
参数
T
要修改的类型。
注解
add_rvalue_reference
类具有名为 type
的成员,它是对模板参数 T 的 rvalue 引用类型的别名。对于非对象和非函数类型 T,引用折叠的语义意味着 T&&
是 T。例如,当 T 是一个 lvalue 引用类型时,add_rvalue_reference<T>::type
是 lvalue 引用类型,而不是 rvalue 引用。
为了方便起见,<type_traits> 定义了一个帮助程序模板 add_rvalue_reference_t
,用于为 add_rvalue_reference
的 type
成员命名别名。
示例
此代码示例使用 static_assert 来显示如何使用 add_rvalue_reference
和 add_rvalue_reference_t
创建右值引用类型,以及 add_rvalue_reference
针对左值引用类型的结果如何不是右值引用,而是到左值引用类型的折叠。
// ex_add_rvalue_reference.cpp
// Build by using: cl /EHsc /W4 ex_add_rvalue_reference.cpp
#include <type_traits>
#include <iostream>
#include <string>
using namespace std;
int main()
{
static_assert(is_same<add_rvalue_reference<string>::type, string&&>::value,
"Expected add_rvalue_reference_t<string> to be string&&");
static_assert(is_same<add_rvalue_reference_t<string*>, string*&&>::value,
"Expected add_rvalue_reference_t<string*> to be string*&&");
static_assert(is_same<add_rvalue_reference<string&>::type, string&>::value,
"Expected add_rvalue_reference_t<string&> to be string&");
static_assert(is_same<add_rvalue_reference_t<string&&>, string&&>::value,
"Expected add_rvalue_reference_t<string&&> to be string&&");
cout << "All static_assert tests of add_rvalue_reference passed." << endl;
return 0;
}
/*Output:
All static_assert tests of add_rvalue_reference passed.
*/
要求
标头:<type_traits>
命名空间: std