Hay dos razones para pasar un argumento por referencia: (1) para el rendimiento (en cuyo caso desea pasar por referencia constante) y (2) porque necesita la capacidad de cambiar el valor del argumento dentro de la función.
Dudo mucho que pasar un largo tiempo sin firmar en arquitecturas modernas te esté frenando demasiado. Así que supongo que tiene la intención de cambiar el valor de State
dentro del método. El compilador se queja porque la constante 0
no se puede cambiar, ya que es un rvalue ("non-lvalue" en el mensaje de error) e inmutable (const
en el mensaje de error).
En pocas palabras, desea un método que pueda cambiar el argumento pasado, pero de forma predeterminada desea pasar un argumento que no puede cambiar.
Dicho de otra manera, las no const
referencias deben referirse a variables reales. El valor predeterminado en la función signatura ( 0
) no es una variable real. Te encuentras con el mismo problema que:
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
Si realmente no tiene la intención de cambiar State
dentro del método, simplemente puede cambiarlo a un const ULONG&
. Pero no obtendrá un gran beneficio de rendimiento de eso, por lo que recomendaría cambiarlo a uno que no sea de referencia ULONG
. Me doy cuenta de que ya está devolviendo a ULONG
, y tengo la astuta sospecha de que su valor es el valor de State
después de las modificaciones necesarias. En cuyo caso simplemente declararía el método así:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Por supuesto, no estoy muy seguro de qué estás escribiendo ni hacia dónde. Pero esa es otra pregunta para otro momento.