มีสองเหตุผลในการส่งผ่านอาร์กิวเมนต์โดยการอ้างอิง: (1) สำหรับประสิทธิภาพ (ซึ่งในกรณีนี้คุณต้องการส่งผ่านการอ้างอิง const) และ (2) เนื่องจากคุณต้องการความสามารถในการเปลี่ยนค่าของอาร์กิวเมนต์ภายในฟังก์ชัน
ฉันสงสัยเป็นอย่างยิ่งว่าการส่งสถาปัตยกรรมสมัยใหม่ที่ไม่ได้ลงนามมานานจะทำให้คุณช้าลงมากเกินไป ดังนั้นฉันสมมติว่าคุณตั้งใจจะเปลี่ยนค่าของState
ภายในเมธอด คอมไพเลอร์กำลังบ่นเนื่องจาก0
ไม่สามารถเปลี่ยนแปลงค่าคงที่ได้เนื่องจากเป็น rvalue ("non-lvalue" ในข้อความแสดงข้อผิดพลาด) และไม่สามารถเปลี่ยนแปลงได้ ( const
ในข้อความแสดงข้อผิดพลาด)
พูดง่ายๆก็คือคุณต้องการวิธีที่สามารถเปลี่ยนอาร์กิวเมนต์ที่ส่งผ่าน แต่โดยค่าเริ่มต้นคุณต้องการส่งผ่านอาร์กิวเมนต์ที่ไม่สามารถเปลี่ยนแปลงได้
กล่าวอีกนัยหนึ่งการไม่const
อ้างอิงต้องอ้างถึงตัวแปรจริง ค่าเริ่มต้นในลายเซ็นฟังก์ชัน ( 0
) ไม่ใช่ตัวแปรจริง คุณกำลังประสบปัญหาเดียวกันกับ:
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
ภายในวิธีนี้คุณสามารถเปลี่ยนเป็นconst ULONG&
ไฟล์. ULONG
แต่คุณจะไม่ได้รับผลประโยชน์ใหญ่จากนั้นดังนั้นผมจะแนะนำให้เปลี่ยนไปไม่ใช่การอ้างอิง ฉันสังเกตเห็นว่าคุณส่งคืน a ULONG
แล้วและฉันสงสัยอย่างลับๆว่าค่าของมันคือมูลค่าState
หลังจากการแก้ไขที่จำเป็น ซึ่งในกรณีนี้ฉันจะประกาศวิธีการดังนี้:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
แน่นอนฉันไม่ค่อยแน่ใจว่าคุณกำลังเขียนอะไรหรือเขียนถึงที่ไหน แต่นั่นเป็นอีกคำถามหนึ่ง