Namespaces
Variants

Ableitungsregeln für std::function

From de.cppreference.net
 
 
Dienstprogrammbibliothek
Sprachunterstützung
Typunterstützung (grundlegende Typen, RTTI)
Feature-Test-Makros der Bibliothek (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Koroutinen-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Dreivektorgleich
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Allgemeine Dienstprogramme
Relationale Operatoren (veraltet in C++20)
Ganzzahl-Vergleichsfunktionen
(C++20)(C++20)(C++20)    
(C++20)
Swap und Typoperationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Allgemeine Vokabular-Typen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
Funktionsobjekte
Funktionsaufruf
(C++17)(C++23)
Identitäts-Funktionsobjekt
(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 Header <functional>
template< class R, class... ArgTypes >
function( R(*)(ArgTypes...) ) -> function<R(ArgTypes...)>;
(1) (seit C++17)
template< class F >
function( F ) -> function</*see below*/>;
(2) (seit C++17)
template< class F >
function( F ) -> function</*see below*/>;
(3) (seit C++23)
template< class F >
function( F ) -> function</*see below*/>;
(4) (seit C++23)
1) Diese Ableitungsregel wird für std::function bereitgestellt, um die Ableitung von Funktionen zu ermöglichen.
2) Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn &F::operator() wohlgeformt ist, wenn es als nicht ausgewerteter Operand behandelt wird, 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 Überladungsauflösung teil, wenn &F::operator() wohlgeformt ist, wenn es als nicht ausgewerteter Operand behandelt wird, und F::operator() eine explizite Objektparameter-Funktion 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 Überladungsauflösung teil, wenn &F::operator() wohlgeformt ist, wenn es als nicht ausgewerteter Operand behandelt wird, und F::operator() eine statische Mitgliedsfunktion ist, deren Typ die Form R(A...) oder R(A...) noexcept hat. Der abgeleitete Typ ist std::function<R(A...)>.

Hinweise

Diese Deduktionsleitlinien erlauben keine Deduktion von einer Funktion mit einem Ellipsen-Parameter , und das ... in den Typen wird stets als eine Pack-Expansion behandelt.

Der von diesen Deduktionsleitfäden abgeleitete Typ kann in einer späteren Standardrevision geändert werden (insbesondere könnte dies geschehen, wenn noexcept -Unterstützung in einer späteren Standardversion zu std::function hinzugefügt wird).

Beispiel

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

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 vom Überladungsauflösung ausgeschlossen ist