Heim > Artikel > Backend-Entwicklung > Beeinflusst das Template-Argument von „std::function“ seinen Typ während der Objektkonstruktion?
Bei Verwendung der Vorlage std::function kommt es zu Mehrdeutigkeiten kann aufgrund mehrerer plausibler Überlastungen entstehen. Betrachten Sie insbesondere den folgenden Codeausschnitt:
<code class="cpp">#include <functional> using namespace std; int a(const function<int()>& f) { return f(); } int a(const function<int(int)>& 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. }</code>
Die Mehrdeutigkeit ergibt sich aus der Tatsache, dass beide Funktionen
Die Signatur des Vorlagenarguments für std::function wird während der Deklaration und Definition als Teil seines Typs betrachtet. Dies ist jedoch bei der Objektkonstruktion nicht der Fall.
std::function verwendet wie viele funktionale Objekte in C eine Technik namens Typlöschung. Dadurch kann es beliebige Objekte oder Funktionen akzeptieren, 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 Konstruktorebene auftreten.
Es gibt drei Hauptoptionen zur Umgehung dieser Mehrdeutigkeit:
Während das Vorlagenargument von std::function seinen Typ bei Deklarationen und Definitionen bestimmt, spielt es 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.
Das obige ist der detaillierte Inhalt vonBeeinflusst das Template-Argument von „std::function“ seinen Typ während der Objektkonstruktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!