Поделиться через


Класс add_rvalue_reference

Создает ссылочный тип rvalue параметра-шаблона, если он является типом объекта или функции. В противном случае из-за семантики сворачивания ссылок этот тип является таким же, как параметр шаблона.

Синтаксис

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, который является псевдонимом для типа ссылки rvalue на параметр шаблона T. Семантика сворачивания ссылок означает, что для типов T, отличных от объектов и не-функций, T&& является T. Например, если T является ссылочным типом lvalue, является ссылочным типом lvalue, add_rvalue_reference<T>::type а не ссылкой rvalue.

Для удобства <type_traits> определяет вспомогательный шаблон, add_rvalue_reference_tкоторый псевдонимирует type член add_rvalue_reference.

Пример

В данном примере кода используется static_assert, чтобы показать, как ссылочные типы rvalue создаются с помощью add_rvalue_reference и add_rvalue_reference_t, и что результат add_rvalue_reference в ссылочном типе lvalue не является ссылкой rvalue, но сворачивается до ссылочного типа lvalue.

// 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