Bei Verwendung der std::function-Vorlage Mehrdeutigkeit kann aufgrund mehrerer plausibler Überlastungen entstehen. Betrachten Sie insbesondere den folgenden Codeausschnitt:
#include
using namespace std;
int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }
int main() {
a(x); // Call is ambiguous.
a(y); // Call is ambiguous.
}
Die Mehrdeutigkeit ergibt sich aus der Tatsache, dass sowohl function
Die Signatur des Vorlagenarguments für std::function wird während der Deklaration und Definition als Teil seines Typs betrachtet. Dies ist jedoch während der Objektkonstruktion nicht der Fall.
std::function verwendet wie viele funktionale Objekte in C eine Technik namens Typlöschung. Dies ermöglicht die Annahme beliebiger Objekte oder Funktionen, sofern diese beim Aufruf die erwartete Signatur erfüllen. Der Nachteil besteht darin, dass Fehler im Zusammenhang mit nicht übereinstimmenden Signaturen tief in der Implementierung und nicht auf der Konstruktorebene auftreten.
Es gibt drei Hauptoptionen, um diese Mehrdeutigkeit zu umgehen:
Während die Das Vorlagenargument von std::function bestimmt seinen Typ bei Deklarationen und Definitionen, es spielt bei der Objektkonstruktion keine Rolle. Dies kann zu Mehrdeutigkeiten führen, wenn Konstruktoren beliebige Argumente akzeptieren. Um dieses Problem zu lösen, können Programmierer explizite Typumwandlung, Funktionsobjektumbruch oder TMP verwenden.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3