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
Défini dans l'en-tête <type_traits>
template < class T >
struct add_cv ;
(1) (depuis C++11)
template < class T >
struct add_const ;
(2) (depuis C++11)
template < class T >
struct add_volatile ;
(3) (depuis C++11)

Fournit le typedef membre type qui est le même que T , sauf qu'il a un qualificatif cv ajouté (à moins que T ne soit une fonction, une référence, ou ait déjà ce qualificatif cv)

1) ajoute à la fois const et volatile
2) ajoute const
3) ajoute volatile

Si le programme ajoute des spécialisations pour l'un des modèles décrits sur cette page, le comportement est indéfini.

Table des matières

Types membres

Nom Définition
type le type T avec le qualificatif cv

Types auxiliaires

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

Implémentation possible

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; };

Notes

Ces traits de transformation peuvent être utilisés pour établir des contextes non déduits dans la déduction d'arguments de template :

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); // erreur, types déduits en conflit pour 'T'
g(4.2, 0); // OK, appelle g<double>

Exemple

#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();
}

Sortie :

Non-cv
Const
Volatile
Const-volatile

Voir aussi

(C++11)
vérifie si un type est qualifié const
(modèle de classe)
vérifie si un type est qualifié volatile
(modèle de classe)
supprime les spécificateurs const et/ou volatile du type donné
(modèle de classe)
(C++17)
obtient une référence const vers son argument
(modèle de fonction)