Có hai lý do để truyền đối số bằng tham chiếu: (1) cho hiệu suất (trong trường hợp bạn muốn chuyển qua tham chiếu const) và (2) vì bạn cần khả năng thay đổi giá trị của đối số bên trong hàm.
Tôi rất nghi ngờ rằng việc vượt qua một thời gian dài không dấu trên các kiến trúc hiện đại đang làm bạn chậm lại quá nhiều. Vì vậy, tôi cho rằng bạn đang có ý định thay đổi giá trị State
bên trong phương thức. Trình biên dịch đang phàn nàn vì hằng số 0
không thể thay đổi, vì đó là một giá trị ("không phải giá trị" trong thông báo lỗi) và không thể thay đổi ( const
trong thông báo lỗi).
Nói một cách đơn giản, bạn muốn một phương thức có thể thay đổi đối số được truyền, nhưng theo mặc định, bạn muốn truyền một đối số không thể thay đổi.
Nói cách khác, các const
tham chiếu không phải tham chiếu đến các biến thực tế. Giá trị mặc định trong chữ ký hàm ( 0
) không phải là biến thực. Bạn đang gặp vấn đề tương tự như:
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
Nếu bạn không thực sự có ý định thay đổi State
bên trong phương thức, bạn có thể chỉ cần thay đổi nó thành a const ULONG&
. Nhưng bạn sẽ không nhận được lợi ích hiệu suất lớn từ đó, vì vậy tôi khuyên bạn nên thay đổi nó thành không tham chiếu ULONG
. Tôi nhận thấy rằng bạn đã trả lại a ULONG
và tôi có một nghi ngờ lén lút rằng giá trị của nó là giá trị State
sau khi có bất kỳ sửa đổi cần thiết nào. Trong trường hợp đó, tôi chỉ cần khai báo phương thức như vậy:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Tất nhiên, tôi không chắc chắn những gì bạn đang viết hoặc đến đâu. Nhưng đó là một câu hỏi cho một thời điểm khác.