Das Ergebnis von a + b
ist ein rvalue-Ausdruck vom Typ A
, der ein temporäres erzeugt und nicht an eine nicht-konstante Referenz binden kann, sodass es die const
-Überladung übernimmt wie Sie eine Const-Referenz an eine temporäre binden können.
In diesem Fall ist der Teilausdruck c
ein lvalue-Ausdruck und Sie dürfen eine nicht-konstante Referenz binden. Da die nicht konstante Version in diesem Fall eine perfekte Übereinstimmung mit T=A
darstellt, wird sie der const-Überladung vorgezogen, die eine Konvertierung im zweiten Argument von einem lvalue vom Typ A
erfordern würde const lvalue vom Typ A
.
&t2
in Ihren Funktionen nimmt eine Referenz.
Allerdings kann a+b
nicht an eine normale Referenz gebunden werden, daher muss sie als const
Referenz übergeben werden.
In Ihrem zweiten main
übergeben Sie einen richtigen lvalue, so dass er von der Funktion modifiziert werden kann (und daher kann const
die Bedeutung ändern).
Das ist zumindest meine Vermutung.