std::add_cv, std::add_const, std::add_volatile
Von cppreference.com
| 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
Führen Sie diesen Code aus
#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) |
| (C++11) |
prüft, ob ein Typ volatile-qualifiziert ist (Klassenvorlage) |
| (C++11)(C++11)(C++11) |
entfernt const und/oder volatile Spezifizierer vom gegebenen Typ (Klassenvorlage) |
| (C++17) |
erhält eine Referenz auf const zu seinem Argument (Funktionsvorlage) |