Ableitungsregeln für std::function
From de.cppreference.net
| 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
Diesen Code ausführen
#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 |