Namensräume
Varianten
Aktionen

std::remove_cv, std::remove_const, std::remove_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
remove_cvremove_constremove_volatile
(C++11)(C++11)(C++11)
(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 remove_cv;
(1) (seit C++11)
template< class T >
struct remove_const;
(2) (seit C++11)
template< class T >
struct remove_volatile;
(3) (seit C++11)

Stellt den Member-Typedef type bereit, der mit T identisch ist, außer dass seine obersten cv-Qualifizierer entfernt werden.

1) Entfernt das oberste const, oder das oberste volatile, oder beides, falls vorhanden.
2) Entfernt das oberste const.
3) Entfernt das oberste volatile.

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 ohne cv-Qualifizierer

[bearbeiten] Hilfstypen

template< class T >
using remove_cv_t = typename remove_cv<T>::type;
(seit C++14)
template< class T >
using remove_const_t = typename remove_const<T>::type;
(seit C++14)
template< class T >
using remove_volatile_t = typename remove_volatile<T>::type;
(seit C++14)

[bearbeiten] Mögliche Implementierung

template<class T> struct remove_cv { typedef T type; };
template<class T> struct remove_cv<const T> { typedef T type; };
template<class T> struct remove_cv<volatile T> { typedef T type; };
template<class T> struct remove_cv<const volatile T> { typedef T type; };
 
template<class T> struct remove_const { typedef T type; };
template<class T> struct remove_const<const T> { typedef T type; };
 
template<class T> struct remove_volatile { typedef T type; };
template<class T> struct remove_volatile<volatile T> { typedef T type; };

[bearbeiten] Beispiel

Das Entfernen von const/volatile von const volatile int* ändert den Typ nicht, da der Zeiger selbst weder const noch volatile ist.

#include <type_traits>
 
template<typename U, typename V>
constexpr bool same = std::is_same_v<U, V>;
 
static_assert
(
    same<std::remove_cv_t<int>, int> &&
    same<std::remove_cv_t<const int>, int> &&
    same<std::remove_cv_t<volatile int>, int> &&
    same<std::remove_cv_t<const volatile int>, int> &&
    // remove_cv only works on types, not on pointers
    not same<std::remove_cv_t<const volatile int*>, int*> &&
    same<std::remove_cv_t<const volatile int*>, const volatile int*> &&
    same<std::remove_cv_t<const int* volatile>, const int*> &&
    same<std::remove_cv_t<int* const volatile>, int*>
);
 
int main() {}

[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]
(C++11)(C++11)(C++11)
fügt const und/oder volatile Spezifizierer zum gegebenen Typ hinzu
(Klassenvorlage) [bearbeiten]
kombiniert std::remove_cv und std::remove_reference
(Klassenvorlage) [bearbeiten]