std::add_cv, std::add_const, std::add_volatile - cppreference.com
De cppreference.com
| Definido en el archivo de encabezado |
||
|
|
(1) | (desde C++11) |
|
|
(2) | (desde C++11) |
|
|
(3) | (desde C++11) |
Proporciona la definición de tipo (typedef) miembro type que es igual a T, excepto que tiene añadido un calificador-cv (a menos que T sea una función, una referencia, o ya tenga este calificador-cv).
1) Añade tanto const como volatile.
2) Añade const
3) Añade volatile.
El comportamiento de un programa que añade especializaciones para cualquiera de las plantillas definidas en esta página no está definido.
Tipos miembro
| Nombre | Definición |
type
|
El tipo T con el calificador-cv.
|
Tipos auxiliares
|
|
(desde C++14) | |
|
|
(desde C++14) | |
|
|
(desde C++14) | |
Posible implementación
template<class T> struct add_cv { typedef const volatile T type; }; template<class T> struct add_const { typedef const T type; }; template<class T> struct add_volatile { typedef volatile T type; };
Notas
Estos rasgos de transformación pueden usarse para establecer contextos no deducidos en la deducción de argumentos de plantilla:
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); // ERROR, tipos conflictivos deducidos para 'T' g(4.2, 0); // de acuerdo, llama a g<double>
Ejemplo
#include <iostream> #include <type_traits> struct foo { void m() { std::cout << "No-cv\n"; } void m() const { std::cout << "Const\n"; } void m() volatile { std::cout << "Volatile\n"; } void m() const volatile { std::cout << "Const-volatil\n"; } }; int main() { foo{}.m(); std::add_const<foo>::type{}.m(); std::add_volatile<foo>::type{}.m(); std::add_cv<foo>::type{}.m(); }
Salida:
No-cv Const Volatil Const-volatil