Spec-Zone.ru › C++

std::remove_cv, std::remove_const, std::remove_volatile

Определён в заголовочном файле <type_traits>
template< class T >
struct remove_cv;
(1) (начиная с C++11)
template< class T >
struct remove_const;
(2) (начиная с C++11)
template< class T >
struct remove_volatile;
(3) (начиная с C++11)

Предоставляет вложенный псевдоним типа type, который совпадает с T, за исключением того, что с него сняты самые верхние cv-квалификаторы.

1) Снимает самые верхние const, самые верхние volatile или оба, если они присутствуют.
2) Снимает самый верхний const.
3) Снимает самый верхний volatile.

Если программа добавляет специализации для любого из шаблонов, описанных на этой странице, поведение не определено.

Типы-члены

Имя Определение
type тип T без cv-квалификатора

Вспомогательные типы

template< class T >
using remove_cv_t = typename remove_cv<T>::type;
(начиная с C++14)
template< class T >
using remove_const_t = typename remove_const<T>::type;
(начиная с C++14)
template< class T >
using remove_volatile_t = typename remove_volatile<T>::type;
(начиная с C++14)

Возможная реализация

template<class T> struct remove_cv { typedef T type; };
template<class T> struct remove_cv<const T> { typedef T type; };
template<class T> struct remove_cv<volatile T> { typedef T type; };
template<class T> struct remove_cv<const volatile T> { typedef T type; };

template<class T> struct remove_const { typedef T type; };
template<class T> struct remove_const<const T> { typedef T type; };

template<class T> struct remove_volatile { typedef T type; };
template<class T> struct remove_volatile<volatile T> { typedef T type; };

Пример

Снятие const/volatile с const volatile int* не изменяет тип, поскольку сам указатель не является ни const, ни volatile.

#include <type_traits>

template<typename U, typename V>
constexpr bool same = std::is_same_v<U, V>;

static_assert
(
    same<std::remove_cv_t<int>, int> &&
    same<std::remove_cv_t<const int>, int> &&
    same<std::remove_cv_t<volatile int>, int> &&
    same<std::remove_cv_t<const volatile int>, int> &&
    // remove_cv only works on types, not on pointers
    not same<std::remove_cv_t<const volatile int*>, int*> &&
    same<std::remove_cv_t<const volatile int*>, const volatile int*> &&
    same<std::remove_cv_t<const int* volatile>, const int*> &&
    same<std::remove_cv_t<int* const volatile>, int*>
);

int main() {}

См. также

is_const
(C++11)
проверяет, имеет ли тип квалификатор const
(шаблон класса)
is_volatile
(C++11)
проверяет, имеет ли тип квалификатор volatile
(шаблон класса)
add_cvadd_constadd_volatile
(C++11)(C++11)(C++11)
добавляет к заданному типу квалификаторы const и/или volatile
(шаблон класса)
remove_cvref
(C++20)
объединяет std::remove_cv и std::remove_reference
(шаблон класса)
remove_cvremove_constremove_volatile
(C++26)(C++26)(C++26)
снимает квалификаторы const и/или volatile с отражённого типа
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/remove_cv

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API