Класс remove_reference
Класс remove_reference из заголовка type_traits
удаляет ссылочный тип из переданного типа.
Если переданный тип является ссылкой (<T&> или <T&&>),
то результатом будет сам тип <T> без ссылки.
Если же переданный тип не является ссылкой,
то он возвращается без изменений.
Внутри класса определен тип type,
который и хранит результат преобразования.
Также существует вспомогательный шаблон
remove_reference_t, который сразу дает
нужный тип без обращения к ::type.
Синтаксис
template <class T>
struct remove_reference;
template <class T>
using remove_reference_t = typename remove_reference<T>::type;
Пример
Давайте удалим ссылку из типа <int&>
и посмотрим на результат:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
using T1 = remove_reference<int&>::type;
using T2 = remove_reference<int&&>::type;
using T3 = remove_reference<int>::type;
cout << is_same<T1, int>::value << endl;
cout << is_same<T2, int>::value << endl;
cout << is_same<T3, int>::value << endl;
return 0;
}
Результат выполнения кода:
1
1
1
Пример
Давайте воспользуемся вспомогательным шаблоном
remove_reference_t и выведем типы с его помощью:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
using T1 = remove_reference_t<int&>;
using T2 = remove_reference_t<int&&>;
using T3 = remove_reference_t<const int&>;
cout << is_same<T1, int>::value << endl;
cout << is_same<T2, int>::value << endl;
cout << is_same<T3, const int>::value << endl;
return 0;
}
Результат выполнения кода:
1
1
1
Пример
Давайте применим remove_reference
к указателю на ссылку и к другим типам:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
using T1 = remove_reference_t<int*&>;
using T2 = remove_reference_t<int*>;
using T3 = remove_reference_t<int&>;
cout << is_same<T1, int*>::value << endl;
cout << is_same<T2, int*>::value << endl;
cout << is_same<T3, int>::value << endl;
return 0;
}
Результат выполнения кода:
1
1
1