2017-05-11 7 views
0


Ich habe ein Problem mit meinem Code. Es gibt folgende Funktionen:Lvalue erforderlich als unary '&' Operand - Übergabe Funktion Ergebnis als Zeiger

static Poly PolyFromCoeff(int coeff); 
static Mono MonoFromPoly(const Poly *p, int exp); 

Und in einer anderen Funktion habe ich diese Zeile:

Mono m = MonoFromPoly(&PolyFromCoeff(10),4); 

Aber ich diese Fehlermeldung erhalten:

lvalue required as unary ‘&’ operand

Wenn ich das erste Ergebnis speichern zu einer Variablen gibt es keinen Fehler:

Poly p = PolyFromCoeff(10); 
Mono m = MonoFromPoly(&p,4); 

Warum ist die erste Lösung falsch?

Antwort

2

Wie bereits erwähnt, benötigt der Operator & einen Lvalue als Argument, d. H. Er kann nicht auf temporäre Werte angewendet werden. Adressen sind nicht nur mit Objekten, sondern auch mit Werten verknüpft.

In der zweiten Form instanziieren Sie ein Objekt, das diesen Wert enthält, und Sie können leicht die Adresse dieses Objekts übernehmen.

1

Die C-Sprache verbietet ausdrücklich die Verwendung der Adresse rvalue (was eine Funktion zurückgibt). Diese Klausel aus dem C11 standard (committee draft) resümiert:

6.5.3.2 Address and indirection operators

Constraints

  1. The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.

Wenn Sie sind verwirrt über lvalue und rvalue, denken Sie daran, wie folgt aus:

  • lvalue etwas ist, das eine Kennung hat und Speicher
  • rvalue ist ein temporäres Ergebnis oder Literalwert

Wenn Sie eine C++ Hintergrund haben, wurde möglicherweise verwirrt Sie, weil das Verhalten der Referenzen ist anders. In C++ ist es in Ordnung, dies zu haben:

static Poly PolyFromCoeff(int coeff); 
static Mono MonoFromPoly(const Poly &p, int exp); 

Mono m = MonoFromPoly(PolyFromCoeff(10), 4); 
Verwandte Themen