Heim >Backend-Entwicklung >C++ >Warum ist die Überlastungsauflösung zwischen „int', „int&&' und „const int&' nicht eindeutig?

Warum ist die Überlastungsauflösung zwischen „int', „int&&' und „const int&' nicht eindeutig?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-29 00:04:15817Durchsuche

Why is Overload Resolution Ambiguous Between `int`, `int&&`, and `const int&`?

Überladungsauflösung zwischen Wert, R-Wert-Referenz und Const-L-Wert-Referenz

Stellen Sie sich das folgende Szenario vor:

int f( int );
int f( int && );
int f( int const & );

int q = f( 3 );

Aufruf von f(3)-Ergebnissen in einer mehrdeutigen Überladungsauflösung. Das Eliminieren von f( int ) führt dazu, dass Clang und GCC der R-Wert-Referenz Vorrang vor der L-Wert-Referenz einräumen. Das Entfernen einer der Referenzüberladungen führt jedoch zu Mehrdeutigkeiten mit f( int).

Überlastungsauflösungsregeln

Überladungsauflösung folgt normalerweise einer strikten Teilreihenfolge. In diesem Fall scheint int jedoch zwei Konzepten zu entsprechen, die einander nicht äquivalent sind. Die spezifischen Regeln für diese Situation lauten wie folgt:

  • Mindestens eine Parameterinitialisierung für den betreffenden Parameter muss besser übereinstimmen als die beiden anderen.
  • Beim Vergleich zweier Initialisierungen Entweder ist das eine besser als das andere, oder keines ist besser (sie sind nicht zu unterscheiden).
  • Ohne spezifische Regeln für die direkte Referenzbindung gelten alle drei Initialisierungen in diesem Szenario wäre nicht zu unterscheiden.
  • Direkte Referenzbindungsregeln machen int && zu einer besseren Übereinstimmung als const int &, aber keiner ist besser oder schlechter als int.

Sonderfall: Referenzbindung

13.3.3.2 des C-Standards sieht eine Sonderregel für die direkte Referenzbindung vor:

If S1 und S2 sind Referenzbindungen (8.5.3) und beziehen sich nicht auf einen impliziten Objektparameter einer nicht statischen Mitgliedsfunktion, die ohne Ref-Qualifizierer deklariert wurde, und S1 bindet dann eine R-Wert-Referenz an einen R-Wert und S2 bindet dann eine L-Wert-Referenz S1 passt besser als S2.

Diese Regel gilt nicht, wenn eine der Initialisierungen keine Referenzbindung ist.

Zukünftige Überlegungen

Es wurde die Idee vorgeschlagen, Referenzbindungen besser aufeinander abzustimmen als Nicht-Referenzbindungen. Um Diskussionen zu diesem Thema anzustoßen, wird empfohlen, solche Vorschläge im ISO C Future Proposals-Forum zu veröffentlichen.

Das obige ist der detaillierte Inhalt vonWarum ist die Überlastungsauflösung zwischen „int', „int&&' und „const int&' nicht eindeutig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn