คำถามติดแท็ก const-correctness


16
ขายฉันเกี่ยวกับความถูกต้องของ const
เหตุใดจึงแนะนำให้ใช้ const ให้บ่อยที่สุด? สำหรับฉันแล้วดูเหมือนว่าการใช้ const อาจเป็นความเจ็บปวดมากกว่าความช่วยเหลือใน C ++ แต่แล้วอีกครั้งฉันมาที่นี่จากมุมมองของ python: ถ้าคุณไม่ต้องการให้บางสิ่งเปลี่ยนไปอย่าเปลี่ยน ด้วยเหตุนี้จึงเป็นคำถามสองสามข้อ: ดูเหมือนว่าทุกครั้งที่ฉันทำเครื่องหมายบางอย่างเป็น const ฉันได้รับข้อผิดพลาดและต้องเปลี่ยนฟังก์ชันอื่นบางอย่างเพื่อให้เป็น const ด้วย แล้วนี้เป็นเหตุให้มีการเปลี่ยนแปลงอีกฟังก์ชั่นที่อื่น นี่เป็นสิ่งที่ง่ายขึ้นเมื่อมีประสบการณ์หรือไม่? ประโยชน์ของการใช้ const จริงๆพอที่จะชดเชยปัญหาหรือไม่ หากคุณไม่ได้ตั้งใจจะเปลี่ยนวัตถุทำไมไม่เขียนโค้ดที่ไม่เปลี่ยนมัน ฉันควรทราบว่า ณ เวลานี้ฉันมุ่งเน้นไปที่ประโยชน์ของการใช้ const เพื่อความถูกต้องและการบำรุงรักษามากที่สุดแม้ว่าจะเป็นเรื่องดีที่ได้ทราบถึงผลกระทบด้านประสิทธิภาพ

4
ความถูกต้องของ const สามารถปรับปรุงประสิทธิภาพได้หรือไม่?
ฉันได้อ่านหลายครั้งแล้วว่าการบังคับใช้ความถูกต้องของ const ในรหัส C หรือ C ++ ของคุณไม่เพียง แต่เป็นแนวทางปฏิบัติที่ดีเกี่ยวกับความสามารถในการบำรุงรักษาเท่านั้น แต่ยังอาจทำให้คอมไพเลอร์ของคุณดำเนินการปรับให้เหมาะสมได้ด้วย อย่างไรก็ตามฉันได้อ่านสิ่งที่ตรงกันข้ามอย่างสมบูรณ์เช่นกัน - ว่ามันไม่มีผลต่อประสิทธิภาพเลย ดังนั้นคุณมีตัวอย่างที่ความถูกต้องของ const อาจช่วยคอมไพเลอร์ของคุณในการปรับปรุงประสิทธิภาพโปรแกรมของคุณหรือไม่?

1
std :: ฟังก์ชั่น const ความถูกต้อง
สมมติว่าฉันมีประเภท callable ดังนี้ struct mutable_callable { int my_mutable = 0; int operator()() { // Not const return my_mutable++; } }; โปรดทราบว่าmutable_callableมีไม่ใช่operator()สมาชิกที่แก้ไขตัวแปรสมาชิก ..... ตอนนี้สมมติว่าฉันสร้างstd::functionประเภทของฉัน: std::function<int()> foo = mutable_callable{}; ตอนนี้ฉันสามารถทำสิ่งนี้: void invoke(std::function<int()> const& z) { z(); } int main() { invoke(foo); // foo changed.....oops } ตอนนี้เท่าที่ผมสามารถบอกได้std::functions operator()เป็นconstตาม: https://en.cppreference.com/w/cpp/utility/functional/function/operator () ดังนั้นความรู้สึกของฉันคือคุณไม่ควรทำสิ่งนี้ ..... แต่จากนั้นดูที่: …

2
คัดลอกคอนสตรัคที่มีอาร์กิวเมนต์ที่ไม่ใช่ const แนะนำโดยกฎความปลอดภัยของเธรด?
ฉันมีเสื้อคลุมสำหรับรหัสดั้งเดิมบางส่วน class A{ L* impl_; // the legacy object has to be in the heap, could be also unique_ptr A(A const&) = delete; L* duplicate(){L* ret; legacy_duplicate(impl_, &L); return ret;} ... // proper resource management here }; ในรหัสดั้งเดิมนี้ฟังก์ชั่นที่ "ทำซ้ำ" วัตถุไม่ปลอดภัยเธรด (เมื่อเรียกอาร์กิวเมนต์แรกเดียวกัน) ดังนั้นมันจึงไม่ถูกทำเครื่องหมายconstใน wrapper ฉันเดากฎต่อไปนี้ที่ทันสมัย: https://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ นี้ดูเหมือนจะเป็นวิธีที่ดีที่จะใช้ตัวสร้างสำเนายกเว้นสำหรับรายละเอียดมันที่ไม่ได้เป็นduplicate constดังนั้นฉันไม่สามารถทำสิ่งนี้โดยตรง: class A{ L* …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.