Namespaces
Variants

std:: add_cv, std:: add_const, std:: add_volatile

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
add_cv add_const add_volatile
(C++11) (C++11) (C++11)
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Definido en el encabezado <type_traits>
template < class T >
struct add_cv ;
(1) (desde C++11)
template < class T >
struct add_const ;
(2) (desde C++11)
template < class T >
struct add_volatile ;
(3) (desde C++11)

Proporciona el typedef miembro type que es el mismo que T , excepto que tiene un calificador cv añadido (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

Si el programa añade especializaciones para cualquiera de las plantillas descritas en esta página, el comportamiento no está definido.

Contenidos

Tipos de miembros

Nombre Definición
type el tipo T con el calificador cv

Tipos auxiliares

template < class T >
using add_cv_t = typename add_cv < T > :: type ;
(desde C++14)
template < class T >
using add_const_t = typename add_const < T > :: type ;
(desde C++14)
template < class T >
using add_volatile_t = typename add_volatile < T > :: type ;
(desde C++14)

Implementación posible

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 utilizarse 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 deducidos en conflicto para 'T'
g(4.2, 0); // OK, llama a g<double>

Ejemplo

#include <iostream>
#include <type_traits>
struct foo
{
    void m() { std::cout << "Non-cv\n"; }
    void m() const { std::cout << "Const\n"; }
    void m() volatile { std::cout << "Volatile\n"; }
    void m() const volatile { 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();
}

Salida:

Non-cv
Const
Volatile
Const-volatile

Véase también

(C++11)
comprueba si un tipo está calificado como const
(class template)
comprueba si un tipo está calificado como volatile
(class template)
elimina los especificadores const y/o volatile del tipo dado
(class template)
(C++17)
obtiene una referencia const a su argumento
(function template)