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' Stateintérieur de la méthode. Le compilateur se plaint parce que la constante 0ne peut pas être modifiée, car il s'agit d'une rvalue ("non-lvalue" dans le message d'erreur) et non modifiable ( constdans 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- constré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 Statela 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 Stateaprè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.