std::remove_cv、std::remove_const、std::remove_volatile
来自 cppreference.com
在头文件 <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
|
无 cv 限定符的 T 类型 |
[编辑] 辅助类型
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 int* 中移除 const/volatile 不会修改类型,因为指针本身既不是 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() {}
[编辑] 另请参阅
(C++11) |
检查类型是否为 const 限定 (类模板) |
(C++11) |
检查类型是否为 volatile 限定 (类模板) |
(C++11)(C++11)(C++11) |
向给定类型添加 const 和/或 volatile 说明符 (类模板) |
(C++20) |
组合 std::remove_cv 和 std::remove_reference (类模板) |