Es gibt zwei Gründe, ein Argument als Referenz zu übergeben: (1) für die Leistung (in diesem Fall möchten Sie als Konstantenreferenz übergeben) und (2), weil Sie die Fähigkeit benötigen, den Wert des Arguments innerhalb der Funktion zu ändern.
Ich bezweifle sehr, dass das Übergeben eines unsignierten Longs für moderne Architekturen Sie zu sehr verlangsamt. Ich gehe also davon aus, dass Sie beabsichtigen, den Wert Stateinnerhalb der Methode zu ändern . Der Compiler beschwert sich, weil die Konstante 0nicht geändert werden kann, da es sich um einen r-Wert ("nicht-l-Wert" in der Fehlermeldung) und einen unveränderlichen Wert handelt (const in der Fehlermeldung) ist.
Einfach ausgedrückt, Sie möchten eine Methode, die das übergebene Argument ändern kann, aber standardmäßig möchten Sie ein Argument übergeben, das sich nicht ändern kann.
Anders ausgedrückt, Nichtreferenzen constmüssen sich auf tatsächliche Variablen beziehen. Der Standardwert in der Funktionssignatur ( 0) ist keine echte Variable. Sie haben das gleiche Problem wie:
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
Wenn Sie nicht beabsichtigen, Statedie Methode zu ändern , können Sie sie einfach in a ändern const ULONG&. Aber Sie werden keinen großen Leistungsvorteil davon erhalten, daher würde ich empfehlen, es in eine Nichtreferenz zu ändern ULONG. Ich stelle fest, dass Sie a bereits zurückgeben ULONG, und ich habe den Verdacht, dass sein Wert der Wert Statenach erforderlichen Änderungen ist. In diesem Fall würde ich die Methode einfach so deklarieren:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Natürlich bin ich mir nicht ganz sicher, was Sie schreiben oder wohin. Aber das ist eine andere Frage für eine andere Zeit.