std::remove_cvref
Определено в заголовочном файле <type_traits> | ||
|---|---|---|
template< class T > struct remove_cvref; | (с C++20) |
Если тип T является типом ссылки, предоставляет член-тип type, который является типом, на который ссылается T, с удалёнными самыми внешними квалификаторами cv. В противном случае type является T, с удалёнными самыми внешними квалификаторами cv.
Поведение программы, которая добавляет специализации для std::remove_cvref, не определено.
Типы-члены
| Название | Определение |
|---|---|
type | тип, на который ссылается T или сам T, если это не ссылка, с удалёнными самыми внешними квалификаторами cv |
Вспомогательные типы
template< class T > using remove_cvref_t = typename remove_cvref<T>::type; | (с C++20) |
Возможная реализация
template<class T>
struct remove_cvref
{
typedef std::remove_cv_t<std::remove_reference_t<T>> type;
}; |
Примечания
| Макрос проверки наличия функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_remove_cvref | 201711L | (C++20) |
std::remove_cvref |
Пример
#include <type_traits>
int main()
{
static_assert(std::is_same_v<std::remove_cvref_t<int>, int>);
static_assert(std::is_same_v<std::remove_cvref_t<int&>, int>);
static_assert(std::is_same_v<std::remove_cvref_t<int&&>, int>);
static_assert(std::is_same_v<std::remove_cvref_t<const int&>, int>);
static_assert(std::is_same_v<std::remove_cvref_t<const int[2]>, int[2]>);
static_assert(std::is_same_v<std::remove_cvref_t<const int(&)[2]>, int[2]>);
static_assert(std::is_same_v<std::remove_cvref_t<int(int)>, int(int)>);
}См. также
|
(C++11)(C++11)(C++11) | удаляет спецификаторы const и/или volatile из заданного типа (шаблон класса) |
|
(C++11) | удаляет ссылку из заданного типа (шаблон класса) |
|
(C++11) | применяет преобразования типов, как при передаче аргумента функции по значению (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/remove_cvref