std::decay
Von cppreference.com
| Definiert in der Kopfdatei <type_traits> |
||
| template< class T > struct decay; |
(seit C++11) | |
Führt die Typkonvertierungen durch, die beim Übergeben von Funktionsargumenten per Wert auftreten. Formal gilt:
- Wenn
Tein "Array vonU" oder eine Referenz darauf ist, ist der Member-TypedeftypeU*.
- Andernfalls, wenn
Tein FunktionstypFoder eine Referenz darauf ist, ist der Member-Typedeftypestd::add_pointer<F>::type.
- Andernfalls ist der Member-Typedef
typestd::remove_cv<std::remove_reference<T>::type>::type.
Wenn das Programm Spezialisierungen für std::decay hinzufügt, ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Member types
| Name | Definition |
type
|
das Ergebnis der Anwendung der Decay-Typkonvertierungen auf T |
[bearbeiten] Helper types
| template< class T > using decay_t = typename decay<T>::type; |
(seit C++14) | |
[bearbeiten] Mögliche Implementierung
template<class T> struct decay { private: typedef typename std::remove_reference<T>::type U; public: typedef typename std::conditional< std::is_array<U>::value, typename std::add_pointer<typename std::remove_extent<U>::type>::type, typename std::conditional< std::is_function<U>::value, typename std::add_pointer<U>::type, typename std::remove_cv<U>::type >::type >::type type; }; |
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#include <type_traits> template<typename T, typename U> constexpr bool is_decay_equ = std::is_same_v<std::decay_t<T>, U>; int main() { static_assert ( is_decay_equ<int, int> && ! is_decay_equ<int, float> && is_decay_equ<int&, int> && is_decay_equ<int&&, int> && is_decay_equ<const int&, int> && is_decay_equ<int[2], int*> && ! is_decay_equ<int[4][2], int*> && ! is_decay_equ<int[4][2], int**> && is_decay_equ<int[4][2], int(*)[2]> && is_decay_equ<int(int), int(*)(int)> ); }
[bearbeiten] Siehe auch
| (C++20) |
kombiniert std::remove_cv und std::remove_reference (Klassenvorlage) |
| implizite Konvertierung | Array-zu-Zeiger-, Funktions-zu-Zeiger-, lvalue-zu-rvalue-Konvertierungen |