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 0bir 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, constreferans 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
StateYö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 ULONGettim ve değerinin Stategerekli 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.