Namensräume
Varianten
Aktionen

std::declval

Von cppreference.com
< cpp‎ | utility
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
Ganzzahl-Vergleichsfunktionen
(C++20)(C++20)(C++20)  
(C++20)
Swap und Typ-Operationen
(C++14)
declval
(C++11)
(C++11)
(C++11)
(C++17)
Gemeinsame Vokabulartypen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
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[bearbeiten]
(C++11)(entfernt in C++20)(C++17)
leitet den Ergebnistyp der Invokation eines aufrufbaren Objekts mit einer Reihe von Argumenten ab
(Klassenvorlage) [bearbeiten]