Es gibt zwei Faktoren, die es Ihrem Code ermöglichen zu arbeiten. Erstens sind Funktionsargumente bis zu einer impliziten Konvertierung zulässig, wenn sie eine Überlastung abgleichen könnten. Zweitens können const
Referenzen an Provisorien binden. Was hier passiert, ist y
wird implizit in int
konvertiert, wodurch eine temporäre Kopie erstellt wird. v
ist dann an dieses temporäre gebunden.
Betrachten Sie das folgende Beispiel:
%Vor% Sie werden feststellen, dass foo(y)
dieselbe Adresse wie y
ausgibt, wobei bar(y)
eine andere Adresse ausgibt. Dies funktioniert nicht mit const
Referenzen. Vor allem, wenn Sie könnten, würde es bedeuten, dass das Ändern von v
nicht wirklich y
ändern könnte.
Ja, das kann ziemlich nervig sein. Die Kompilierung wird aufgrund einer impliziten Konvertierung von y
in eine anonyme temporäre int
am aufrufenden Standort ausgeführt, und eine const int&
-Bindung ist zulässig.
Sie können dies durch Schreiben von
besiegen %Vor%oder sogar
%Vor%so alle Überladungen außer der explizit angegebenen werden gelöscht.
Tags und Links c++ pass-by-reference