table of contents
std::remove_cv,std::remove_const,std::remove_volatile(3) | C++ Standard Libary | std::remove_cv,std::remove_const,std::remove_volatile(3) |
NAME¶
std::remove_cv,std::remove_const,std::remove_volatile - std::remove_cv,std::remove_const,std::remove_volatile
Synopsis¶
Defined in header <type_traits>
template< class T > (1) (since C++11)
struct remove_cv;
template< class T > (2) (since C++11)
struct remove_const;
template< class T > (3) (since C++11)
struct remove_volatile;
Provides the member typedef type which is the same as T, except that its
topmost
cv-qualifiers are removed.
1) removes the topmost const, or the topmost volatile, or both, if present.
2) removes the topmost const
3) removes the topmost volatile
The behavior of a program that adds specializations for any of the templates
described on this page is undefined.
Member types¶
Name Definition
type the type T without cv-qualifier
Helper types¶
template< class T > (since C++14)
using remove_cv_t = typename remove_cv<T>::type;
template< class T > (since C++14)
using remove_const_t = typename remove_const<T>::type;
template< class T > (since C++14)
using remove_volatile_t = typename remove_volatile<T>::type;
Possible implementation¶
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; };
Example¶
Removing const/volatile from const volatile int * does not modify
the type, because
the pointer itself is neither const nor volatile.
// Run this code
#include <iostream>
#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 >
and same< std::remove_cv_t< const int >, int >
and same< std::remove_cv_t< volatile int >, int >
and same< std::remove_cv_t< const volatile int >, int >
and same< std::remove_cv_t< const volatile int* >, const volatile
int* >
and same< std::remove_cv_t< const int* volatile >, const int* >
and same< std::remove_cv_t< int* const volatile >, int* >
);
int main() {
std::cout << std::boolalpha;
using type1 = std::remove_cv<const int>::type;
using type2 = std::remove_cv<volatile int>::type;
using type3 = std::remove_cv<const volatile int>::type;
using type4 = std::remove_cv<const volatile int*>::type;
using type5 = std::remove_cv<int* const volatile>::type;
std::cout << std::is_same<type1, int>::value <<
"\n";
std::cout << std::is_same<type2, int>::value <<
"\n";
std::cout << std::is_same<type3, int>::value <<
"\n";
std::cout << std::is_same<type4, int*>::value << "
"
<< std::is_same<type4, const volatile int*>::value <<
"\n";
std::cout << std::is_same<type5, int*>::value <<
"\n";
}
Output:¶
true
true
true
false true
true
See also¶
is_const checks if a type is const-qualified
(C++11) (class template)
is_volatile checks if a type is volatile-qualified
(C++11) (class template)
add_cv
add_const
add_volatile adds const or/and volatile specifiers to the given type
(C++11) (class template)
(C++11)
(C++11)
remove_cvref combines std::remove_cv and std::remove_reference
(C++20) (class template)
2022.07.31 | http://cppreference.com |