Gegeben sind drei überladene Funktionen mit unterschiedlichen Parametertypen (Wert, r-Wert-Referenz, konstante L-Wert-Referenz), Ein Funktionsaufruf kann mehrdeutig werden, wenn alle drei Überladungen realisierbar sind. In diesem Artikel werden die Regeln zur Überlastungsauflösung in solchen Szenarien erläutert und das in C beobachtete differenzierte Verhalten untersucht.
Da nur ein Parameter berücksichtigt werden muss, besagt die Regel, dass eine Parameterinitialisierung erfolgen muss passt besser als beidedie anderen beiden. Beim Vergleich zweier Initialisierungen gilt entweder eine als besser oder keine von beiden als besser (nicht unterscheidbar).
Ohne spezielle Regeln für die direkte Referenzbindung wären die drei Initialisierungen in allen drei Vergleichen nicht unterscheidbar. Diese Sonderregeln heben jedoch int&& (R-Wert-Referenz) über const int& (L-Wert-Referenz) an, während keiner von beiden als besser oder schlechter als int (Wert) angesehen wird. Somit entsteht keine beste Übereinstimmung.
Dieses Verhalten wird in der folgenden Matrix veranschaulicht:
S1 S2 int int&& indistinguishable int const int& indistinguishable int&& const int& S1 better
Die Matrix zeigt, dass int&& gegenüber const int& bevorzugt wird basierend auf Abschnitt 13.3.3.2 des C-Standards. Diese Regel gilt für Referenzbindungen, die nicht auf implizite Objektparameter nicht statischer Memberfunktionen ohne Ref-Qualifizierer verweisen und bei denen S1 eine R-Wert-Referenz an einen R-Wert bindet, während S2 eine L-Wert-Referenz bindet.
Allerdings Diese Regel gilt nicht, wenn eine der Initialisierungen keine Referenzbindung ist, daher die Mehrdeutigkeit.
Der Autor schlägt vor, int&& (rvalue reference) als eine bessere Übereinstimmung als int (value) zu betrachten, da die Referenz an einen Initialisierer gebunden sein muss, während der Objekttyp keiner solchen Einschränkung unterliegt. Dadurch könnte möglicherweise eine neue Überlastungsauflösungsregel erstellt werden, die der Bindung von einem Initialisierer Priorität einräumt. Dieser Vorschlag erfordert jedoch weitere Diskussionen und eine mögliche Standardisierung durch die isocpp-Plattform für zukünftige Vorschläge.
Das obige ist der detaillierte Inhalt vonWann kommt es zu Mehrdeutigkeiten bei der C-Überlastungsauflösung zwischen den Parametern „Value', „Rvalue Reference' und „Const Lvalue Reference'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!