Heim >Backend-Entwicklung >C++ >Wann kommt es zu Mehrdeutigkeiten bei der C-Überlastungsauflösung zwischen den Parametern „Value', „Rvalue Reference' und „Const Lvalue Reference'?

Wann kommt es zu Mehrdeutigkeiten bei der C-Überlastungsauflösung zwischen den Parametern „Value', „Rvalue Reference' und „Const Lvalue Reference'?

Linda Hamilton
Linda HamiltonOriginal
2024-11-28 11:16:13769Durchsuche

When Do C   Overload Resolution Ambiguities Arise Between Value, Rvalue Reference, and Const Lvalue Reference Parameters?

Mehrdeutigkeit der Überlastungsauflösung: Wert, R-Wert-Referenz und konstante L-Wert-Referenz

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.

Die Regel

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.

Vergleichsmatrix

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.

Zukunft Richtung

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!

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