Heim >Backend-Entwicklung >C++ >Wie behandelt die C-Überladungsauflösung die Parameter „Value', „Rvalue Reference' und „Const Lvalue Reference'?

Wie behandelt die C-Überladungsauflösung die Parameter „Value', „Rvalue Reference' und „Const Lvalue Reference'?

DDD
DDDOriginal
2024-12-01 09:40:12289Durchsuche

How Does C   Overload Resolution Handle Value, Rvalue Reference, and Const Lvalue Reference Parameters?

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

Bei der Überladungsauflösung kommt es nicht selten vor, dass bei mehreren Aufrufen mehrdeutige Aufrufe auftreten brauchbare Funktionen haben denselben Parametertyp. Ein besonders interessanter Fall entsteht, wenn eine Überladung zwischen einem Wert, einer R-Wert-Referenz und einer Konstantwert-Referenz auftritt.

Mehrdeutigkeit und Auflösung

Angesichts der Funktionen:

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

der Aufruf int q = f( 3 ); wird mehrdeutig. Clang und GCC bevorzugen die R-Wert-Referenz gegenüber der L-Wert-Referenz, wenn f( int ) entfernt wird. Das Entfernen einer Referenzüberladung führt jedoch zu Mehrdeutigkeiten mit f( int ).

Regeln für die Überlastungsauflösung

Die Überlastungsauflösung basiert auf der Suche nach einer eindeutigen „besseren Übereinstimmung“ für der Parameter. Ohne spezielle Regeln wären alle drei Initialisierungen (Wert, R-Wert-Referenz und konstante L-Wert-Referenz) nicht unterscheidbar.

Da jedoch eine r-Wert-Referenz an einen r-Wert gebunden ist und eine konstante L-Wert-Referenz nicht, ist die Die R-Wert-Referenz wird aufgrund der folgenden Regel in als bessere Übereinstimmung angesehen 13.3.3.2:

S1 binds an rvalue reference to an rvalue and S2 binds an lvalue reference.

Diese Regel gilt nicht, wenn eine Initialisierung keine Referenzbindung ist.

Vorschlag für zukünftige Standards

Die Der Autor schlägt vor, dass ein int && in zukünftigen Standards dem int vorgezogen werden sollte, da es im Gegensatz zum uneingeschränkten Objekt eine Initialisierungsbindung an einen Initialisierer erzwingt Typ. Dies könnte als Alternative zur reinen Wertübergabe dienen und gleichzeitig den Aufwand für das Verschieben vermeiden.

Das obige ist der detaillierte Inhalt vonWie behandelt die C-Überladungsauflösung die Parameter „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