Ci sono due ragioni per passare un argomento per riferimento: (1) per le prestazioni (nel qual caso si desidera passare per riferimento const) e (2) perché è necessaria la possibilità di modificare il valore dell'argomento all'interno della funzione.
Dubito fortemente che passare un lungo senza segno sulle architetture moderne ti stia rallentando troppo. Quindi presumo che tu intenda modificare il valore di State
all'interno del metodo. Il compilatore si lamenta perché la costante 0
non può essere modificata, poiché è un rvalue ("non-lvalue" nel messaggio di errore) e non modificabile ( const
nel messaggio di errore).
In poche parole, vuoi un metodo che possa cambiare l'argomento passato, ma per impostazione predefinita vuoi passare un argomento che non può cambiare.
In altre parole, i non const
riferimenti devono fare riferimento a variabili effettive. Il valore predefinito nella funzione signature ( 0
) non è una variabile reale. Stai riscontrando lo stesso problema di:
struct Foo {
virtual ULONG Write(ULONG& State, bool sequence = true);
};
Foo f;
ULONG s = 5;
f.Write(s); // perfectly OK, because s is a real variable
f.Write(0); // compiler error, 0 is not a real variable
// if the value of 0 were changed in the function,
// I would have no way to refer to the new value
Se non intendi effettivamente cambiare State
all'interno del metodo, puoi semplicemente cambiarlo in un file const ULONG&
. Ma non ne trarrai un grande vantaggio in termini di prestazioni, quindi consiglierei di cambiarlo in un non riferimento ULONG
. Ho notato che stai già restituendo un ULONG
, e ho il subdolo sospetto che il suo valore sia il valore di State
dopo ogni modifica necessaria. In tal caso, dichiarerei semplicemente il metodo come tale:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Ovviamente non sono abbastanza sicuro di cosa stai scrivendo o di dove. Ma questa è un'altra domanda per un'altra volta.