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 State
innerhalb der Methode zu ändern . Der Compiler beschwert sich, weil die Konstante 0
nicht 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 const
mü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, State
die 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 State
nach 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.