Il y a deux raisons de passer un argument par référence: (1) pour les performances (auquel cas vous voulez passer par référence const) et (2) parce que vous avez besoin de la possibilité de changer la valeur de l'argument à l'intérieur de la fonction.
Je doute fort que passer un temps non signé sur les architectures modernes vous ralentisse trop. Je suppose donc que vous avez l'intention de changer la valeur de l' State
intérieur de la méthode. Le compilateur se plaint parce que la constante 0
ne peut pas être modifiée, car il s'agit d'une rvalue ("non-lvalue" dans le message d'erreur) et non modifiable ( const
dans le message d'erreur).
En termes simples, vous voulez une méthode qui peut changer l'argument passé, mais par défaut, vous voulez passer un argument qui ne peut pas changer.
Pour le dire autrement, les non- const
références doivent se référer à des variables réelles. La valeur par défaut de la fonction signature ( 0
) n'est pas une vraie variable. Vous rencontrez le même problème 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 vous n'avez pas vraiment l'intention de modifier State
la méthode, vous pouvez simplement la changer en un fichier const ULONG&
. Mais vous n'obtiendrez pas un grand avantage en termes de performances, donc je recommanderais de le remplacer par une non-référence ULONG
. Je remarque que vous retournez déjà un ULONG
, et j'ai un soupçon sournois que sa valeur est la valeur de State
après toutes les modifications nécessaires. Dans ce cas, je déclarerais simplement la méthode comme suit:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Bien sûr, je ne suis pas tout à fait sûr de ce que vous écrivez ou vers où. Mais c'est une autre question pour une autre fois.