Il y a deux raisons de passer un argument par référence : (1) pour des raisons de performance (dans ce cas, vous voulez passer par référence constante) 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 le passage d'un long non signé sur les architectures modernes vous ralentisse trop. Donc je suppose que vous avez l'intention de changer la valeur de State
à l'intérieur de la méthode. Le compilateur se plaint parce que la constante 0
ne peut pas être modifié, 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 modifier l'argument passé, mais par défaut, vous voulez passer un argument qui ne peut pas changer.
Pour le dire autrement, le non const
Les références doivent se référer à des variables réelles. La valeur par défaut dans la signature de la fonction ( 0
) n'est pas une variable réelle. 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 l'intention de changer State
à l'intérieur de la méthode, vous pouvez simplement le changer en un const ULONG&
. Mais vous n'obtiendrez pas un grand avantage en termes de performances, je vous recommande donc de le remplacer par une non-référence. ULONG
. Je remarque que vous renvoyez déjà un ULONG
et j'ai la nette impression que sa valeur est celle de State
après toutes les modifications nécessaires. Dans ce cas, je déclarerai simplement la méthode comme telle :
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Bien sûr, je ne sais pas trop ce que vous écrivez ni à qui. Mais c'est une autre question pour une autre fois.