Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | types
 
 
Metaprogrammierungsbibliothek
Typmerkmale
Typkategorien
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
Typeneigenschaften
(C++11)
(C++11)
(C++14)
(C++11)(deprecated in C++26)
(C++11)(bis C++20*)
(C++11)(veraltet in C++20)
(C++11)
Typmerkmalskonstanten
Metafunktionen
(C++17)
Unterstützte Operationen
Beziehungen und Eigenschaftsabfragen
Typmodifikationen
add_cvadd_constadd_volatile
(C++11)(C++11)(C++11)
Typentransformationen
(C++11)(veraltet in C++23)
(C++11)(veraltet in C++23)
(C++11)
(C++11)(bis C++20*)(C++17)

(C++11)
(C++11)
(C++17)
Rationale Arithmetik zur Compilezeit
Ganzzahlsequenzen zur Compilezeit
 
Definiert in der Kopfdatei <type_traits>
template< class T >
struct add_cv;
(1) (seit C++11)
template< class T >
struct add_const;
(2) (seit C++11)
template< class T >
struct add_volatile;
(3) (seit C++11)

Stellt den Member-Typalias type bereit, der derselbe ist wie T, außer dass er einen cv-Qualifikator hinzugefügt hat (es sei denn, T ist eine Funktion, eine Referenz oder hat bereits diesen cv-Qualifikator)

1) fügt sowohl const als auch volatile hinzu
2) fügt const hinzu
3) fügt volatile hinzu

Wenn das Programm Spezialisierungen für eine der auf dieser Seite beschriebenen Vorlagen hinzufügt, ist das Verhalten undefiniert.

Inhalt

[bearbeiten] Member-Typen

Name Definition
type der Typ T mit dem cv-Qualifikator

[bearbeiten] Hilfstypen

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

[bearbeiten] Mögliche Implementierung

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

[bearbeiten] Anmerkungen

Diese Transformations-Traits können verwendet werden, um Nicht-deduzierte Kontexte in der Vorlagenargumentdeduktion zu etablieren

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, deduced conflicting types for 'T'
g(4.2, 0); // OK, calls g<double>

[bearbeiten] Beispiel

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

Ausgabe

Non-cv
Const
Volatile
Const-volatile

[bearbeiten] Siehe auch

(C++11)
prüft, ob ein Typ const-qualifiziert ist
(Klassenvorlage) [bearbeiten]
prüft, ob ein Typ volatile-qualifiziert ist
(Klassenvorlage) [bearbeiten]
entfernt const und/oder volatile Spezifizierer vom gegebenen Typ
(Klassenvorlage) [bearbeiten]
(C++17)
erhält eine Referenz auf const zu seinem Argument
(Funktionsvorlage) [edit]