Há duas razões para passar um argumento por referência: (1) para desempenho (nesse caso, você deseja passar por referência const) e (2) porque você precisa da capacidade de alterar o valor do argumento dentro da função.
Eu duvido muito que passar um longo tempo sem sinal em arquiteturas modernas esteja atrasando você demais. Portanto, estou assumindo que você pretende alterar o valor de State
dentro do método. O compilador está reclamando porque a constante 0
não pode ser alterada, pois é um rvalue ("não-lvalue" na mensagem de erro) e imutável ( const
na mensagem de erro).
Simplificando, você quer um método que pode mudar o argumento passado, mas por padrão você deseja passar um argumento que não pode mudar.
Em outras palavras, as não const
referências têm que se referir a variáveis reais. O valor padrão na assinatura da função ( 0
) não é uma variável real. Você está tendo o mesmo 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
Se você realmente não pretende alterar State
dentro do método, pode simplesmente alterá-lo para um const ULONG&
. Mas você não terá um grande benefício de desempenho com isso, então eu recomendo alterá-lo para um não-referência ULONG
. Percebi que você já está retornando a ULONG
e tenho uma leve suspeita de que seu valor é o valor de State
após quaisquer modificações necessárias. Nesse caso, eu simplesmente declararia o método assim:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Claro, não tenho certeza do que você está escrevendo ou para onde. Mas essa é outra questão para outra hora.