Inkrementierter Operator für die Referenzvariable

8

Warum funktioniert die Arbeit vor dem Inkrementieren, aber das Post-Inkrement nicht auf einer Referenzvariablen?

%Vor%

Warum ist swap(++a, ++b) erlaubt, aber swap(a++, b++) sagt:

  

[Fehler] ungültige Initialisierung von nichtkonstanten Referenz vom Typ 'int & amp;' aus einem rvalue vom Typ 'int'

    
user3580455 02.10.2015, 16:07
quelle

3 Antworten

8

Wenn Sie

anrufen %Vor%

a++ und b++ geben Ihnen ein temporäres Objekt, da nach dem Inkrementieren die vorherigen Werte zurückgegeben werden. Da swap() seine Parameter als Referenz verwendet, können sie nicht an diese temporären Werte gebunden werden. Verwenden Sie ++a und ++b arbeiten, wenn wir zuerst a und b erhöhen und dann an swap übergeben, so dass es keine temporäre gibt.

    
NathanOliver 02.10.2015 16:13
quelle
1

++ a gibt einen l-Wert zurück, aber a ++ gibt einen r-Wert zurück. Sie müssen einen l-Wert an die Funktion swap () übergeben.

Relevanter Beitrag zu l-value und r-value: Postfix (Präfix) Inkrement, L-Wert und R-Wert (in C und C ++)

    
Lorenzo Belli 02.10.2015 16:14
quelle
1

Die Funktion std::swap muss den Wert von zwei Variablen austauschen, auch bekannt als Lvalue-Referenz. Der Ausdruck x++ ist keine Variable, sondern ein Wert oder ein rvalue. Ein rvalue kann nicht an eine lvalue-Referenz gebunden werden.

Der Unterschied zwischen einem rvalue und einem lvalue könnte so erklärt werden:

%Vor%

Aber Folgendes ist nicht gültig:

%Vor%

Was Sie an std::swap senden, sind zwei Zahlenwerte.

    
Guillaume Racicot 02.10.2015 16:20
quelle

Tags und Links