Überladungsauflösung zwischen Wert, R-Wert-Referenz, Const-L-Wert-Referenz
Berücksichtigen Sie die folgenden Funktionsüberladungen:
int f( int ); int f( int && ); int f( int const & );
Der Aufruf int q = f( 3 ); ist mehrdeutig, da alle drei Überladungen für das Argument zulässig sind. Die Regeln für die Überlastungsauflösung besagen, dass es eine Parameterinitialisierung geben muss, die besser ist als die beiden anderen.
In diesem Fall sind die Parameterinitialisierungen:
Allerdings ist keine dieser Initialisierungen besser als die anderen beiden. Daher ist der Aufruf mehrdeutig.
Das Entfernen von f( int ) führt dazu, dass Clang und GCC die R-Wert-Referenz (int&&) der L-Wert-Referenz (int const&) vorziehen. Dies liegt daran, dass die R-Wert-Referenz an den R-Wert 3 gebunden werden kann, die L-Wert-Referenz jedoch nicht. Das Entfernen einer Referenzüberladung führt zu Mehrdeutigkeiten mit f( int ).
Dieses Verhalten ist auf die Tatsache zurückzuführen, dass int sowohl zu int&& als auch zu int const& äquivalent ist. Allerdings sind int&& und int const& nicht äquivalent zueinander. Die Regel für die Auswahl zwischen ihnen lautet, dass int&& besser ist als int const&, wenn beide Referenzbindungen sind und int&& an einen R-Wert und int const& an einen L-Wert bindet.
Diese Regel gilt nicht, wenn eine der Initialisierungen ist keine Referenzbindung. Daher ist int nicht von int&& und int const& zu unterscheiden.
Es besteht keine Chance, dass int&& in einem zukünftigen Standard dem int vorgezogen wird. Die vorgeschlagene Regel würde eine Referenzbindung zu einer besseren Übereinstimmung machen als eine Nicht-Referenzbindung, was den bestehenden Regeln für die Überlastungsauflösung widersprechen würde.
Das obige ist der detaillierte Inhalt vonWie geht C Overload Resolution mit „int', „int&&' und „const int&' um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!