std::declval
| Definiert in der Header-Datei <utility> |
||
template< class T > typename std::add_rvalue_reference<T>::type declval() noexcept; |
(seit C++11) (bis C++14) (nur unverwertete Ausdrücke) |
|
| template< class T > std::add_rvalue_reference_t<T> declval() noexcept; |
(seit C++14) (nur unverwertete Ausdrücke) |
|
Hilfs-Template zum Schreiben von Ausdrücken, die in unverwerteten Kontexten auftreten, typischerweise als Operand von decltype. In einem unverwerteten Kontext konvertiert dieses Hilfs-Template jeden Typ T (der ein unvollständiger Typ sein kann) in einen Ausdruck dieses Typs, wodurch es möglich wird, Memberfunktionen von T zu verwenden, ohne Konstruktoren durchlaufen zu müssen.
std::declval kann nur in unverwerteten Kontexten verwendet werden und muss nicht definiert sein; die Auswertung eines Ausdrucks, der diese Funktion enthält, ist ein Fehler. Formell ist das Programm schlecht gebildet, wenn diese Funktion ODR-verwendet wird.
Inhalt |
[bearbeiten] Parameter
(keine)
[bearbeiten] Rückgabewert
Kann nicht ausgewertet werden und gibt daher niemals einen Wert zurück. Der Rückgabetyp ist T&& (Referenz-Kollisionsregeln gelten), es sei denn, T ist (möglicherweise cv-qualifiziertes) void, in welchem Fall der Rückgabetyp T ist.
[bearbeiten] Hinweise
std::declval wird häufig in Templates verwendet, bei denen akzeptable Template-Parameter keine gemeinsamen Konstruktoren haben, aber die gleiche Memberfunktion besitzen, deren Rückgabetyp benötigt wird.
[bearbeiten] Mögliche Implementierung
template<typename T> typename std::add_rvalue_reference<T>::type declval() noexcept { static_assert(false, "declval not allowed in an evaluated context"); } |
[bearbeiten] Beispiel
#include <iostream> #include <utility> struct Default { int foo() const { return 1; } }; struct NonDefault { NonDefault() = delete; int foo() const { return 1; } }; int main() { decltype(Default().foo()) n1 = 1; // type of n1 is int decltype(std::declval<Default>().foo()) n2 = 1; // same // decltype(NonDefault().foo()) n3 = n1; // error: no default constructor decltype(std::declval<NonDefault>().foo()) n3 = n1; // type of n3 is int std::cout << "n1 = " << n1 << '\n' << "n2 = " << n2 << '\n' << "n3 = " << n3 << '\n'; }
Ausgabe
n1 = 1 n2 = 1 n3 = 1
[bearbeiten] Siehe auch
decltype-Spezifizierer(C++11) |
ermittelt den Typ eines Ausdrucks oder einer Entität |
| (C++11)(entfernt in C++20)(C++17) |
leitet den Ergebnistyp der Invokation eines aufrufbaren Objekts mit einer Reihe von Argumenten ab (Klassenvorlage) |