Deduktionshilfen für std::function
Von cppreference.com
< cpp | utility | functional | function
| 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
Führen Sie diesen Code aus
#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 |