Bir bağımsız değişkeni başvuruya göre iletmenin iki nedeni vardır: (1) performans için (bu durumda const başvurusuyla geçmek istersiniz) ve (2) çünkü işlev içindeki bağımsız değişkenin değerini değiştirme yeteneğine ihtiyacınız vardır.
Modern mimarilerde imzasız bir süre geçmenin sizi çok fazla yavaşlattığından şüpheliyim. Dolayısıyla State
, yöntemin içindeki değerini değiştirmeyi düşündüğünüzü varsayıyorum . Derleyici şikayet ediyor çünkü sabit 0
bir rvalue (hata mesajında "non-lvalue") ve değiştirilemez (const
hata mesajında) olduğu için değiştirilemiyor.
Basitçe ifade etmek gerekirse, geçirilen argümanı değiştirebilen bir yöntem istersiniz, ancak varsayılan olarak değiştirilemeyen bir argüman iletmek istersiniz.
Başka bir deyişle, const
referans olmayanların gerçek değişkenlere atıfta bulunması gerekir. İmzadaki ( 0
) varsayılan değer gerçek bir değişken değildir. Aynı problemle karşılaşıyorsunuz:
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
State
Yöntemin içinde gerçekten değişme niyetinde değilseniz, onu basitçe bir const ULONG&
. Ancak bundan büyük bir performans avantajı elde etmeyeceksiniz, bu yüzden onu referans olmayan bir şekilde değiştirmenizi tavsiye ederim ULONG
. Zaten a döndürdüğünüzü fark ULONG
ettim ve değerinin State
gerekli herhangi bir değişiklikten sonra değeri olduğuna dair sinsi bir şüphem var . Bu durumda yöntemi basitçe şöyle bildiririm:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Elbette, ne yazdığından veya nereye yazdığından pek emin değilim. Ama bu başka bir zaman için başka bir soru.