Namensräume
Varianten
Aktionen

Deduktionshilfen für std::function

Von cppreference.com
< cpp‎ | utility‎ | functional‎ | function
 
 
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)
 
Funktionsobjekte
Funktionsaufruf
(C++17)(C++23)
Identitätsfunktions-Objekt
(C++20)
Transparente Operator-Wrapper
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

Alte Binder und Adaptoren
(bis C++17*)
(bis C++17*)
(bis C++17*)
(bis C++17*)
(bis C++17*)(bis C++17*)(bis C++17*)(bis C++17*)
(bis C++20*)
(bis C++20*)
(bis C++17*)(bis C++17*)
(bis C++17*)(bis C++17*)

(bis C++17*)
(bis C++17*)(bis C++17*)(bis C++17*)(bis C++17*)
(bis C++20*)
(bis C++20*)
 
 
Definiert in der Header-Datei <functional>
template< class R, class... ArgTypes >
function( R(*)(ArgTypes...) ) -> function<R(ArgTypes...)>;
(1) (seit C++17)
template< class F >
function( F ) -> function</*siehe unten*/>;
(2) (seit C++17)
template< class F >
function( F ) -> function</*siehe unten*/>;
(3) (seit C++23)
template< class F >
function( F ) -> function</*siehe unten*/>;
(4) (seit C++23)
1) Diese Deduktionshilfe wird für std::function bereitgestellt, um die Deduktion aus Funktionen zu ermöglichen.
2) Diese Überladung nimmt nur an der Auflösung von Überladungen teil, wenn &F::operator() als nicht ausgewerteter Operand wohlgeformt ist und decltype(&F::operator()) die Form R(G::*)(A...) hat (optional cv-qualifiziert, optional noexcept, optional lvalue-Referenz qualifiziert). Der abgeleitete Typ ist std::function<R(A...)>.
3) Diese Überladung nimmt nur an der Auflösung von Überladungen teil, wenn &F::operator() als nicht ausgewerteter Operand wohlgeformt ist und F::operator() eine Funktion mit explizitem Objektparameter ist, deren Typ die Form R(G, A...) oder R(G, A...) noexcept hat. Der abgeleitete Typ ist std::function<R(A...)>.
4) Diese Überladung nimmt nur an der Auflösung von Überladungen teil, wenn &F::operator() als nicht ausgewerteter Operand wohlgeformt ist und F::operator() eine statische Memberfunktion ist, deren Typ die Form R(A...) oder R(A...) noexcept hat. Der abgeleitete Typ ist std::function<R(A...)>.

[bearbeiten] Anmerkungen

Diese Deduktionshilfen erlauben keine Deduktion aus einer Funktion mit einem Ellipsenparameter, und die ... in den Typen wird immer als Pack-Expansion behandelt.

Der von diesen Deduktionshilfen abgeleitete Typ kann sich in einer späteren Standardrevision ändern (insbesondere kann dies geschehen, wenn die Unterstützung für noexcept in einer späteren Standardversion zu std::function hinzugefügt wird).

[bearbeiten] Beispiel

#include <functional>
int func(double) { return 0; }
int main() {
  std::function f{func}; // guide #1 deduces function<int(double)>
  int i = 5;
  std::function g = [&](double) { return i; }; // guide #2 deduces function<int(double)>
}

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3238 C++17 Verhalten von (2) war unklar, wenn
F::operator() &&-qualifiziert ist
klargestellt, dass es von der Auflösung von Überladungen ausgeschlossen wird