Ü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!