Ada dua alasan untuk meneruskan argumen dengan referensi: (1) untuk performa (dalam hal ini Anda ingin meneruskan referensi const) dan (2) karena Anda memerlukan kemampuan untuk mengubah nilai argumen di dalam fungsi.
Saya sangat meragukan bahwa melewatkan waktu yang lama pada arsitektur modern terlalu memperlambat Anda. Jadi saya berasumsi bahwa Anda bermaksud mengubah nilai State
di dalam metode. Kompilator mengeluh karena konstanta 0
tidak dapat diubah, karena ini adalah nilai r ("non-lvalue" dalam pesan kesalahan) dan tidak dapat diubah ( const
dalam pesan kesalahan).
Sederhananya, Anda menginginkan metode yang dapat mengubah argumen yang diteruskan, tetapi secara default Anda ingin meneruskan argumen yang tidak dapat diubah.
Dengan kata lain, non- const
referensi harus mengacu pada variabel aktual. Nilai default di function signature ( 0
) bukanlah variabel nyata. Anda mengalami masalah yang sama seperti:
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
Jika Anda tidak benar-benar berniat untuk mengubah State
di dalam metode ini, Anda dapat mengubahnya menjadi const ULONG&
. Tetapi Anda tidak akan mendapatkan keuntungan kinerja yang besar dari itu, jadi saya akan merekomendasikan untuk mengubahnya menjadi non-referensi ULONG
. Saya perhatikan bahwa Anda telah mengembalikan a ULONG
, dan saya curiga bahwa nilainya adalah nilai State
setelah modifikasi yang diperlukan. Dalam hal ini saya hanya akan mendeklarasikan metode sebagai berikut:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Tentu saja, saya tidak yakin apa yang Anda tulis atau ke mana. Tapi itu pertanyaan lain untuk lain waktu.