std::add_cv, std::add_const, std::add_volatile
来自cppreference.com
在标头 <type_traits> 定义 | ||
template<class T > struct add_cv; | (1) | (C++11 起) |
template<class T > struct add_const; | (2) | (C++11 起) |
template<class T > struct add_volatile; | (3) | (C++11 起) |
提供成员 typedef type
,它与 T
相同,但它拥有添加的 cv 限定符(除非 T
是函数、引用或已拥有此 cv 限定符)。
1) 添加 const 和 volatile
2) 添加 const
3) 添加 volatile
如果程序添加了此页面上描述的任何模板的特化,那么行为未定义。
目录 |
[编辑]成员类型
名称 | 定义 |
type | 带 cv 限定符的类型 T |
[编辑]辅助类型
template<class T > using add_cv_t =typename add_cv<T>::type; | (C++14 起) | |
template<class T > using add_const_t =typename add_const<T>::type; | (C++14 起) | |
template<class T > using add_volatile_t =typename add_volatile<T>::type; | (C++14 起) | |
[编辑]可能的实现
template<class T>struct add_cv {typedefconstvolatile T type;}; template<class T>struct add_const {typedefconst T type;}; template<class T>struct add_volatile {typedefvolatile T type;}; |
[编辑]注解
这些变换特征能用于在模板实参推导中建立非推导语境:
template<class T>void f(const T&, const T&); template<class T>void g(const T&, std::add_const_t<T>&); f(4.2, 0);// 错误:对 'T' 推导出冲突的类型 g(4.2, 0);// OK:调用 g<double>
[编辑]示例
运行此代码
#include <iostream>#include <type_traits> struct foo {void m(){std::cout<<"无 cv\n";}void m()const{std::cout<<"const\n";}void m()volatile{std::cout<<"volatile\n";}void m()constvolatile{std::cout<<"const-volatile\n";}}; int main(){ foo{}.m(); std::add_const<foo>::type{}.m(); std::add_volatile<foo>::type{}.m(); std::add_cv<foo>::type{}.m();}
输出:
无cv const volatile const-volatile
[编辑]参阅
(C++11) | 检查类型是否为 const 限定 (类模板) |
(C++11) | 检查类型是否为 volatile 限定 (类模板) |
(C++11)(C++11)(C++11) | 从给定类型移除 const 和/或 volatile 限定符 (类模板) |
(C++17) | 获得到其实参的 const 引用 (函数模板) |