Domanda

In Effective C ++, elemento 3, Scott Meyers suggerisce di sovraccaricare operator* per una classe denominata Rational:

    class Rational { ... };
    const Rational operator*(const Rational& lhs, const Rational& rhs);

Il motivo per cui il valore restituito è qualificato da const è spiegato nella riga seguente: se non fosse const, i programmatori potrebbero scrivere codice come:

    (a * b) = c;

o, più probabilmente:

     if (a*b = c)

Abbastanza giusto. Ora sono confuso perché pensavo che il valore di ritorno di una funzione, qui operatore *, fosse un rvalue, quindi non assegnabile.Presumo che non sia assegnabile perché se avessi:

    int foo();
    foo() += 3;

che non riuscirebbe a compilare con invalid lvalue in assignment. Perché non succede qui?Qualcuno può far luce su questo?

MODIFICA : ho visto molti altri thread su quell'articolo di Scott Meyers, ma nessuno ha affrontato il problema del valore che ho esposto qui.

È stato utile?

Soluzione

Il punto è che per i tipi di classe, a = b è solo una scorciatoia per a.operator=(b), dove operator= è una funzione membro.E le funzioni membro possono essere chiamate su rvalues.

Nota che in C ++ 11 puoi inibirlo rendendo operator= solo lvalue:

class Rational
{
public:
  Rational& operator=(Rational const& other) &;
  // ...
};

Il & dice al compilatore che questa funzione potrebbe non essere chiamata su rvalues.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top