ขายฉันเกี่ยวกับความถูกต้องของ const


135

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

  1. ดูเหมือนว่าทุกครั้งที่ฉันทำเครื่องหมายบางอย่างเป็น const ฉันได้รับข้อผิดพลาดและต้องเปลี่ยนฟังก์ชันอื่นบางอย่างเพื่อให้เป็น const ด้วย แล้วนี้เป็นเหตุให้มีการเปลี่ยนแปลงอีกฟังก์ชั่นที่อื่น นี่เป็นสิ่งที่ง่ายขึ้นเมื่อมีประสบการณ์หรือไม่?

  2. ประโยชน์ของการใช้ const จริงๆพอที่จะชดเชยปัญหาหรือไม่ หากคุณไม่ได้ตั้งใจจะเปลี่ยนวัตถุทำไมไม่เขียนโค้ดที่ไม่เปลี่ยนมัน

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


1
ย้อนหลังได้ 8 ปี แต่ .. แล้วการเร่งรหัส 100x ของคุณให้เร็วขึ้น (เห็นแบบนี้) ล่ะ?
lorro

1
ตรวจสอบคำตอบของฉันที่นี่ (คำถามที่เกี่ยวข้องฉันตอบเหมือนกัน): stackoverflow.com/questions/42310477/… BTW: ฉันรักconst
Gines Hidalgo

คำตอบ:


160

นี้เป็นบทความที่ชัดเจนเกี่ยวกับ "ความถูกต้อง const": https://isocpp.org/wiki/faq/const-correctness

สรุปการใช้ const เป็นแนวทางปฏิบัติที่ดีเพราะ ...

  1. ช่วยปกป้องคุณจากการเปลี่ยนแปลงตัวแปรโดยไม่ได้ตั้งใจที่ไม่ได้ตั้งใจให้เปลี่ยนแปลง
  2. ช่วยปกป้องคุณจากการกำหนดตัวแปรโดยไม่ได้ตั้งใจและ
  3. คอมไพเลอร์สามารถปรับให้เหมาะสมได้ ตัวอย่างเช่นคุณได้รับการปกป้องจาก

    if( x = y ) // whoops, meant if( x == y )
    

ในขณะเดียวกันคอมไพลเลอร์สามารถสร้างโค้ดที่มีประสิทธิภาพมากขึ้นเนื่องจากรู้ว่าสถานะของตัวแปร / ฟังก์ชันจะเป็นอย่างไรตลอดเวลา หากคุณกำลังเขียนโค้ด C ++ แน่นนี่เป็นสิ่งที่ดี

คุณถูกต้องเนื่องจากอาจเป็นเรื่องยากที่จะใช้ความถูกต้องของ const อย่างสม่ำเสมอ แต่ end code จะกระชับและปลอดภัยกว่าในการเขียนโปรแกรมด้วย เมื่อคุณพัฒนา C ++ เป็นจำนวนมากประโยชน์ของสิ่งนี้จะปรากฏขึ้นอย่างรวดเร็ว


ฉันคิดเสมอว่าค่า const สามารถแคชได้อย่างอิสระดังนั้นจึงหลีกเลี่ยงปัญหาการเกิดพร้อมกันจำนวนมากหรือปรับปรุงความเร็ว เป็นเช่นนั้นจริงหรือ?
Phil H

3
แน่นอน constตัวแปรสามารถปรับปรุงความเร็วในแง่ที่ว่าคอมไพลเลอร์สามารถสร้างโค้ดที่ดีที่สุดได้มากขึ้นเนื่องจากทราบเจตนาทั้งหมดและการใช้งานตัวแปร คุณจะสังเกตเห็นความแตกต่างหรือไม่? นั่นเป็นเรื่องที่ถกเถียงกันในใบสมัครของคุณ เท่าที่เกี่ยวข้องกับการเกิดพร้อมกันตัวแปร const เป็นแบบอ่านอย่างเดียวซึ่งหมายความว่าไม่จำเป็นต้องมีการล็อกเฉพาะสำหรับตัวแปรเหล่านั้นเนื่องจากค่าจะเหมือนกันเสมอ
Jordan Parmer

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

3
สำหรับฉันการเพิ่มค่าที่ใหญ่ที่สุดอย่างหนึ่งของความถูกต้อง const คือคุณรู้เพียงแค่ดูที่ต้นแบบฟังก์ชันเมื่อพอยน์เตอร์อ้างอิงข้อมูลที่ไม่เคยกลายพันธุ์โดยฟังก์ชัน (เช่นอินพุตเท่านั้น)
cp.engr

1
อย่าลืมว่ามีความมั่นคงทางตรรกะและทางกายภาพ ออบเจ็กต์รวมใด ๆ ที่มีอยู่ซึ่งถูกทำเครื่องหมายว่าเปลี่ยนแปลงได้สามารถเปลี่ยนแปลงได้แม้ว่าการทำเครื่องหมายเป็นนัยว่าไม่มีส่วนเกี่ยวข้องกับความมั่นคงทางตรรกะของวัตถุที่มีอยู่
Adrian

129

นี่คือโค้ดที่มีข้อผิดพลาดทั่วไปที่ความถูกต้องของ const สามารถป้องกันคุณจาก:

void foo(const int DEFCON)
{
   if (DEFCON = 1)     //< FLAGGED AS COMPILER ERROR! WORLD SAVED!
   {
       fire_missiles();
   }
}

19
ดังนั้นเรากำลังบอกว่า const จำเป็นเพราะคนบ้าเลือดบางคนเลือก "=" เป็นตัวดำเนินการกำหนดใน C? ;-)
Steve Jessop

37
แน่นอนว่าคอมไพเลอร์ที่ทันสมัยส่วนใหญ่เตือนเกี่ยวกับการกำหนดในเงื่อนไขและเราทุกคนเปิดคำเตือนการปฏิบัติเป็นค่าสถานะข้อผิดพลาดขวา: ->
Jack Bolding

7
อย่ายากเกินไปกับตัวอย่างนั้น: นี่เป็นตัวอย่างเดียวกับที่นักพัฒนาบางรายเผยแพร่เพื่อโน้มน้าวให้เราใช้ if (0 == i) แทน if (i == 0) ในที่สุดรูปแบบรหัสของ Doug สามารถใช้นอกคำสั่ง "if" ได้ สิ่งที่สำคัญคือการแสดงให้เห็นถึงประโยชน์อย่างหนึ่งของ const ในทางตลก + 1
paercebal

2
บางคอมไพเลอร์ (และ Lints) ได้รับการแจ้งเตือนเกี่ยวกับเรื่องนี้มาเป็นเวลานานและที่เป็นประโยชน์มากขึ้นที่จะจับ typo กว่านี้ const: codepad.org/Nnf5JUXV

7
@ Roger คุณคิดว่าเราอาศัยอยู่ในโลกที่สิ่งปลูกสร้างสะอาดและปราศจากการเตือน ประสบการณ์ของฉันคือในคำเตือนรหัสจำนวนมากหลงทางในเสียงรบกวน นอกจากนี้ยังมีโค้ดจำนวนมากที่กำหนดงานในนิพจน์ if และหลายคนจะโต้แย้งว่าเป็นรูปแบบที่ "ดี" ที่ถูกต้อง
Doug T.

63

ดูเหมือนว่าทุกครั้งที่ฉันทำเครื่องหมายบางอย่างเป็น const ฉันได้รับข้อผิดพลาดและต้องเปลี่ยนฟังก์ชันอื่นบางอย่างเพื่อให้เป็น const ด้วย แล้วนี่ทำให้ฉันต้องเปลี่ยนฟังก์ชั่นอื่นที่อื่น นี่เป็นสิ่งที่ง่ายขึ้นเมื่อมีประสบการณ์หรือไม่?

จากประสบการณ์นี่เป็นตำนานทั้งหมด มันเกิดขึ้นเมื่อไม่ถูกต้องตั้งค่าด้วยรหัส const ที่ถูกต้องแน่ใจ หากคุณออกแบบ const ให้ถูกต้องตั้งแต่เริ่มต้นสิ่งนี้ไม่ควรเป็นปัญหา ถ้าคุณทำบางสิ่งบางอย่าง const และบางสิ่งบางอย่างแล้วอื่นไม่ complile คอมไพเลอร์จะบอกคุณสิ่งที่สำคัญมากและคุณควรใช้เวลาในการแก้ไขได้อย่างถูกต้อง


7
สิ่งนี้ช่วยฉันป้องกันจุดบกพร่องมากมายที่ฉันมีฟังก์ชัน const เกี่ยวกับการเรียกใช้ฟังก์ชันที่ไม่ใช่ const เพราะฉันลืมว่ามันแก้ไขข้อมูลที่อยู่ข้างใต้
Mooing Duck

11
มีน้อยคนที่จะเริ่มต้นด้วยฐานรหัสที่สะอาดเสมอ การเข้ารหัสส่วนใหญ่เป็นการบำรุงรักษารหัสเดิมซึ่งความคิดเห็นที่ยกมานั้นค่อนข้างถูกต้อง ฉันใช้ const เมื่อเขียนฟังก์ชั่น leaf ใหม่ แต่ฉันตั้งคำถามว่ามันคุ้มค่าที่จะไล่ตามโค้ดที่ไม่คุ้นเคยไปถึงครึ่งโหลหรือโหล
Warren Dew

3
นี่เป็นประสบการณ์ที่ผิดอย่างสิ้นเชิง ประเภทจุดที่ซ้อนกันจะสร้างความปวดหัวที่สุดให้กับสิ่งประเภทนี้โดยที่คุณสามารถมีตัวระบุค่า const หลายตัวในประเภทเดียว
Noldorin

4
"ถ้าคุณออกแบบ const ให้ถูกต้องตั้งแต่เริ่มต้น" คุณมีความหรูหราในการบังคับให้ const-correctness ตั้งแต่เริ่มต้นกี่ครั้ง ?? พวกเราส่วนใหญ่ต้องจัดการกับ API และไลบรารีจำนวนมากในแต่ละวันซึ่งไม่ใช่กรณีนี้และมีเพียงเล็กน้อยที่คุณสามารถทำได้เกี่ยวกับสิ่งเหล่านี้ ดังนั้นฉันจึงเห็นด้วยกับความเชื่อมั่นของ OPs "ดูเหมือนว่าทุกครั้งที่ฉันทำเครื่องหมายบางอย่างเป็น const ฉันจะได้รับข้อผิดพลาด a" ...
nyholku

@WarrenDew นั่นคือการโต้แย้ง หากผู้เขียนต้นฉบับใช้constอย่างถูกต้อง (เช่น "ตั้งแต่เริ่มต้น") ก็จะไม่มีปัญหาซึ่งตรงประเด็น!
Lightness Races ใน Orbit

31

ไม่ใช่สำหรับคุณเมื่อคุณเขียนโค้ดในตอนแรก สำหรับคนอื่น (หรือคุณในอีกไม่กี่เดือนต่อมา) ที่กำลังดูการประกาศวิธีการภายในคลาสหรืออินเทอร์เฟซเพื่อดูว่ามันทำอะไร การไม่แก้ไขวัตถุเป็นข้อมูลสำคัญในการรวบรวมจากสิ่งนั้น


1
นี่เป็นเพียงความจริงเท่านั้น Const ถูกใช้เป็นการป้องกันเช่นกันเพื่อบังคับใช้ในตัวแปรผ่านอินเทอร์เฟซและอื่น ๆ
Jordan Parmer

เป็นเช่นนั้น แต่คุณสามารถบังคับใช้สิ่งนั้นได้โดยใช้หลักปฏิบัติในการเขียนโค้ดที่มีระเบียบวินัยและสถานะของผู้โพสต์ ประโยชน์ที่แท้จริงมาจากสิ่งนี้สะท้อนให้เห็นใน API
Antonio Haley

2
ตรง ควรมี "const int Value = 5;" กว่ามี "int ConstValue = 5;" +1.
paercebal

6
เวลาที่เหมาะสมในการกำหนดความถูกต้องคือเมื่อคุณเขียน API ในตอนแรก มิฉะนั้นคุณจะมีปัญหากับ const-toxic เมื่อคุณติดตั้งเพิ่มเติม (ซึ่งเป็นสาเหตุที่การเพิ่มลงในรหัสเก่าจึงเป็นเรื่องที่แตกต่างอย่างสิ้นเชิงกับการทำในรหัสใหม่)
Donal Fellows

@DonalFellows นี่ไม่ได้บอกว่าใส่ใน const ในภายหลัง เป็นการบอกว่าคุณจะได้รับผลประโยชน์ในภายหลังเมื่อคุณอ่านรหัสที่มี const อยู่แล้ว
Caleth

27

หากคุณใช้ const อย่างเข้มงวดคุณจะแปลกใจว่ามีตัวแปรจริงเพียงไม่กี่ตัวในฟังก์ชันส่วนใหญ่ มักไม่เกินตัวนับลูป หากรหัสของคุณไปถึงจุดนั้นคุณจะรู้สึกอบอุ่นภายใน ... การตรวจสอบความถูกต้องโดยการรวบรวม ... ขอบเขตของการเขียนโปรแกรมเชิงฟังก์ชันอยู่ใกล้ ๆ ... คุณเกือบจะสัมผัสได้แล้ว ...


1
ตั้งแต่ C ++ 17 และความดี constexpr ฉันกำลังเขียนการทดสอบหน่วยเวลาคอมไพล์ ... เข้าใกล้มากขึ้น ...
QBziZ

22

const เป็นสัญญาที่คุณทำในฐานะนักพัฒนาและขอความช่วยเหลือจากคอมไพเลอร์ในการบังคับใช้

เหตุผลของฉันในการถูกต้อง const:

  • เป็นการสื่อสารกับลูกค้าของฟังก์ชันของคุณว่าคุณจะไม่เปลี่ยนตัวแปรหรือวัตถุ
  • การยอมรับข้อโต้แย้งโดยการอ้างอิง const ทำให้คุณมีประสิทธิภาพในการส่งผ่านข้อมูลอ้างอิงด้วยความปลอดภัยในการส่งผ่านค่า
  • การเขียนอินเทอร์เฟซของคุณเป็น const ถูกต้องจะทำให้ไคลเอนต์สามารถใช้งานได้ หากคุณเขียนอินเทอร์เฟซของคุณเพื่อใช้ในการอ้างอิงที่ไม่ใช่ const ไคลเอนต์ที่ใช้ const จะต้องทิ้ง constness ออกไปเพื่อทำงานร่วมกับคุณ นี่เป็นสิ่งที่น่ารำคาญอย่างยิ่งหากอินเทอร์เฟซของคุณยอมรับ char * ที่ไม่ใช่ const และลูกค้าของคุณกำลังใช้ std :: strings เนื่องจากคุณจะได้รับ const char * จากพวกเขาเท่านั้น
  • การใช้ const จะเกณฑ์คอมไพเลอร์เพื่อให้คุณซื่อสัตย์ดังนั้นคุณจะไม่เปลี่ยนแปลงสิ่งที่ไม่ควรเปลี่ยนแปลงโดยผิดพลาด

20

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


20

การเขียนโปรแกรม C ++ โดยไม่มี const ก็เหมือนกับการขับรถโดยไม่ได้เปิดเข็มขัดนิรภัย

การคาดเข็มขัดนิรภัยทุกครั้งที่ก้าวขึ้นรถเป็นความเจ็บปวดและ 364 จาก 365 วันคุณจะมาถึงอย่างปลอดภัย

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


18

สำหรับการเขียนโปรแกรมแบบฝังการใช้constอย่างรอบคอบเมื่อประกาศโครงสร้างข้อมูลส่วนกลางสามารถประหยัด RAM ได้มากโดยทำให้ข้อมูลคงที่อยู่ใน ROM หรือแฟลชโดยไม่ต้องคัดลอกไปยัง RAM ในเวลาบูต

ในการเขียนโปรแกรมในชีวิตประจำวันการใช้constอย่างระมัดระวังจะช่วยให้คุณหลีกเลี่ยงการเขียนโปรแกรมที่ขัดข้องหรือทำงานที่คาดเดาไม่ได้เนื่องจากพยายามแก้ไขตัวอักษรสตริงและข้อมูลส่วนกลางอื่น ๆ ที่คงที่

เมื่อทำงานร่วมกับโปรแกรมเมอร์คนอื่น ๆ ในโครงการขนาดใหญ่การใช้constอย่างถูกต้องจะช่วยป้องกันไม่ให้โปรแกรมเมอร์คนอื่นควบคุมคุณได้


13

constช่วยให้คุณแยกรหัสที่ "เปลี่ยนแปลงสิ่งต่างๆ" ด้านหลังของคุณ constดังนั้นในชั้นเรียนคุณต้องการทำเครื่องหมายวิธีการทั้งหมดที่ไม่ได้เปลี่ยนสถานะของวัตถุที่เป็น นั่นหมายความว่าconstอินสแตนซ์ของคลาสนั้นจะไม่สามารถเรียกใช้constวิธีการใด ๆ ที่ไม่ใช่เมธอดได้อีกต่อไป ด้วยวิธีนี้คุณจะถูกป้องกันไม่ให้เรียกใช้ฟังก์ชันที่สามารถเปลี่ยนแปลงวัตถุของคุณโดยไม่ได้ตั้งใจ

นอกจากนี้ยังconstเป็นส่วนหนึ่งของกลไกการโอเวอร์โหลดดังนั้นคุณสามารถมีสองวิธีที่มีลายเซ็นเหมือนกัน แต่มีconstวิธีหนึ่งและไม่มี คนที่มีconstชื่อเรียกสำหรับconstการอ้างอิงและอีกคนหนึ่งเรียกว่าไม่ใช่constการอ้างอิง

ตัวอย่าง:

#include <iostream>

class HelloWorld {
    bool hw_called;

public:
    HelloWorld() : hw_called(false) {}

    void hw() const {
        std::cout << "Hello, world! (const)\n";
        // hw_called = true;  <-- not allowed
    }

    void hw() {
        std::cout << "Hello, world! (non-const)\n";
        hw_called = true;
    }
};

int
main()
{
    HelloWorld hw;
    HelloWorld* phw1(&hw);
    HelloWorld const* phw2(&hw);

    hw.hw();    // calls non-const version
    phw1->hw(); // calls non-const version
    phw2->hw(); // calls const version
    return 0;
}

13

ความถูกต้องเป็นหนึ่งในสิ่งเหล่านั้นที่จำเป็นต้องมีตั้งแต่เริ่มต้น อย่างที่คุณพบมันเป็นความเจ็บปวดอย่างมากที่จะเพิ่มในภายหลังโดยเฉพาะอย่างยิ่งเมื่อมีการพึ่งพาระหว่างฟังก์ชันใหม่ที่คุณกำลังเพิ่มและฟังก์ชันเก่าที่ไม่ถูกต้องที่มีอยู่แล้ว

ในโค้ดจำนวนมากที่ฉันเขียนมันคุ้มค่ากับความพยายามเพราะเรามักจะใช้การจัดองค์ประกอบเป็นจำนวนมาก:

class A { ... }
class B { A m_a; const A& getA() const { return m_a; } };

หากเราไม่มีค่าความถูกต้องคุณจะต้องหันกลับไปใช้การส่งคืนวัตถุที่ซับซ้อนตามค่าเพื่อให้มั่นใจว่าไม่มีใครจัดการสถานะภายในของคลาส B ที่อยู่ด้านหลังของคุณ

ในระยะสั้นความถูกต้อง const เป็นกลไกการตั้งโปรแกรมป้องกันเพื่อช่วยตัวเองจากความเจ็บปวดบนท้องถนน


7

สมมติว่าคุณมีตัวแปรใน Python คุณรู้ว่าคุณไม่ควรแก้ไข ถ้าเผลอทำอะไรลงไป?

C ++ ช่วยให้คุณสามารถป้องกันตัวเองจากการทำอะไรบางอย่างโดยไม่ได้ตั้งใจตั้งแต่แรก ในทางเทคนิคคุณสามารถไปไหนมาไหนได้ แต่คุณต้องทำงานพิเศษเพื่อถ่ายทำเอง


4

มีบทความที่ดีเป็นที่นี่เกี่ยวกับ const ใน C ++ เป็นความคิดเห็นที่ตรงไปตรงมา แต่หวังว่าจะช่วยได้บ้าง


3

เมื่อคุณใช้คีย์เวิร์ด "const" คุณกำลังระบุอินเทอร์เฟซอื่นให้กับคลาสของคุณ มีอินเทอร์เฟซที่รวมเมธอดทั้งหมดและอินเทอร์เฟซที่มีเฉพาะเมธอด const เห็นได้ชัดว่าสิ่งนี้ช่วยให้คุณ จำกัด การเข้าถึงบางสิ่งที่คุณไม่ต้องการให้เปลี่ยนแปลง

ใช่มันจะง่ายขึ้นเมื่อเวลาผ่านไป


2

ฉันชอบความถูกต้องของ const ... ในทางทฤษฎี ทุกครั้งที่ฉันพยายามใช้มันอย่างจริงจังในทางปฏิบัติมันก็พังทลายลงในที่สุดและ const_cast ก็เริ่มคืบคลานในการทำให้โค้ดน่าเกลียด

บางทีมันอาจจะเป็นแค่รูปแบบการออกแบบที่ฉันใช้ แต่ const มักจะกลายเป็นแปรงที่กว้างเกินไป

ตัวอย่างเช่นลองนึกภาพเอ็นจินฐานข้อมูลแบบธรรมดา ... มันมีวัตถุสคีมาตารางฟิลด์ ฯลฯ ผู้ใช้อาจมีตัวชี้ 'const Table' ซึ่งหมายความว่าพวกเขาไม่ได้รับอนุญาตให้แก้ไขสคีมาของตารางเอง ... แต่จะจัดการอย่างไร ข้อมูลที่เกี่ยวข้องกับตาราง? หากเมธอด Insert () ถูกทำเครื่องหมาย const จากนั้นภายในจะต้องทิ้ง const-ness ออกไปเพื่อจัดการกับฐานข้อมูลจริงๆ หากไม่ได้ทำเครื่องหมาย const แสดงว่าจะไม่ป้องกันการเรียกเมธอด AddField

บางทีคำตอบคือการแบ่งชั้นเรียนตามข้อกำหนดของ const-ness แต่มีแนวโน้มที่จะทำให้การออกแบบซับซ้อนมากกว่าที่ฉันต้องการเพื่อประโยชน์ที่จะได้รับ


ฉันคิดว่าตัวอย่างของคุณเป็นกรณีของการใช้ const มากเกินไป แต่อย่าลืมเกี่ยวกับตัวปรับเปลี่ยนที่เปลี่ยนแปลงได้ซึ่งสามารถนำไปใช้กับตัวแปรอินสแตนซ์เพื่อลบ const-ness
Zooba

2
เมื่อใดที่ฟังก์ชันแทรก () จะถูกทำเครื่องหมาย const เว้นแต่จะตั้งชื่อผิด การเพิ่มสิ่งต่างๆมักจะแก้ไขสิ่งที่คุณเพิ่มเข้าไปซึ่งหมายความว่าไม่ใช่ const สิ่งที่คุณต้องการจริงๆคือ TableWithConstSchema
Greg Rogers

ฉันสามารถเพิ่มคลาสอื่นได้ แต่ฉันไม่ต้องการทำให้ API ซับซ้อนโดยไม่จำเป็นอย่างหมดจดเพื่อความถูกต้องของ const
Rob Walker

1

คุณสามารถให้คำแนะนำคอมไพเลอร์ด้วย const ได้เช่นกัน .... ตามรหัสต่อไปนี้

#include <string>

void f(const std::string& s)
{

}
void x( std::string& x)
{
}
void main()
{
    f("blah");
    x("blah");   // won't compile...
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.