Istnieją dwa powody, dla których należy przekazać argument przez odwołanie: (1) ze względu na wydajność (w takim przypadku chcesz przekazać przez odwołanie do stałej) i (2), ponieważ potrzebujesz możliwości zmiany wartości argumentu wewnątrz funkcji.
Wątpię, czy zbyt długi czas poświęcony nowoczesnym architekturom zbytnio Cię spowolni. Zakładam więc, że zamierzasz zmienić wartość State
wewnątrz metody. Kompilator narzeka, ponieważ stałej 0
nie można zmienić, ponieważ jest to wartość r („non-lvalue” w komunikacie o błędzie) i niezmienna (const
w komunikacie o błędzie).
Mówiąc najprościej, potrzebujesz metody, która może zmienić przekazany argument, ale domyślnie chcesz przekazać argument, którego nie można zmienić.
Inaczej mówiąc, elementy niebędące const
referencjami muszą odnosić się do rzeczywistych zmiennych. Wartość domyślna funkcji signature ( 0
) nie jest rzeczywistą zmienną. Masz ten sam problem, co:
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
Jeśli w rzeczywistości nie zamierzasz zmieniać State
w metodzie, możesz po prostu zmienić ją na const ULONG&
. Ale nie odniesiesz z tego dużej korzyści z wydajności, więc poleciłbym zmienić to na nie-odniesienie ULONG
. Zauważyłem, że zwracasz już a ULONG
, i mam podstępne podejrzenie, że jego wartość jest wartością State
po wszelkich potrzebnych modyfikacjach. W takim przypadku po prostu zadeklarowałbym metodę jako taką:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Oczywiście nie jestem pewien, co piszesz ani gdzie. Ale to kolejne pytanie na inny czas.