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_referencetype 成员命名别名。

示例

此代码示例使用 static_assert 来显示如何使用 add_rvalue_referenceadd_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

另请参阅

<type_traits>
add_lvalue_reference 类
is_rvalue_reference 类