int a = 5;
const int b = a, c = 4;
int e[a];
int d[b];
int f[c];
คำจำกัดความของf[c]ถูกต้อง
ตัวแปรbยังเป็นค่าคงที่intแต่คอมไพเลอร์ให้ฉันข้อผิดพลาด"การแสดงออกต้องมีค่าคงที่"int d[b]สำหรับบรรทัด อะไรคือความแตกต่างระหว่างbและc?
int a = 5;
const int b = a, c = 4;
int e[a];
int d[b];
int f[c];
คำจำกัดความของf[c]ถูกต้อง
ตัวแปรbยังเป็นค่าคงที่intแต่คอมไพเลอร์ให้ฉันข้อผิดพลาด"การแสดงออกต้องมีค่าคงที่"int d[b]สำหรับบรรทัด อะไรคือความแตกต่างระหว่างbและc?
คำตอบ:
อะไรคือความแตกต่างระหว่าง b และ c
c มีเวลาเริ่มต้นคงที่คอมไพล์ในขณะที่ b ไม่มี วัตถุ const ที่มีค่าเริ่มต้นคงที่เวลาคอมไพล์เป็นตัวเองเป็นค่าคงที่เวลารวบรวม
เนื่องจากฉันสามารถกำหนดหนึ่งในสิบของ arry โดยใช้ค่าคงที่ดังนั้นทำไมจึงใช้งานไม่ได้
ไม่ใช่แค่ค่าคงที่เท่านั้นที่จะทำ constqualifier หมายถึง constness runtime (เช่นค่าอาจถูกกำหนดที่ runtime แต่จะไม่เปลี่ยนแปลงตลอดอายุการใช้งานของวัตถุ) สามารถใช้เฉพาะค่าคงที่ของเวลาในการรวบรวมเป็นขนาดอาร์เรย์
คุณกำลังใช้ตัวแปรที่ไม่คงที่เพื่อกำหนดค่าให้กับค่าคงที่ ดังนั้นค่าของตัวแปรนั้นไม่สามารถกำหนดเวลารวบรวมได้ ฉันรู้ว่าคุณไม่ได้เปลี่ยนaแต่คอมไพเลอร์ไม่คิดเช่นนี้
การวินิจฉัยคอมไพเลอร์ควรเป็นเวลารวบรวมนิพจน์ค่าคงที่ที่ประเมินได้จริง ๆ
เนื่องจากวัตถุเดิมที่bได้รับมอบหมายไม่ได้const, bไม่ได้เป็นเวลารวบรวมการแสดงออก evaluable คงที่ดังนั้นการรวบรวมจะล้มเหลวเป็นอาร์เรย์ตัวแปรความยาวยังไม่ได้รับการสนับสนุนในมาตรฐาน C ++
"const" เพียงแค่หมายความว่าตัวแปรจะไม่เปลี่ยนแปลง ณ รันไทม์และไม่ได้หมายความว่าค่าของมันสามารถสรุปได้ในเวลารวบรวม
ฉันเดาสิ่งที่คุณกำลังมองหาคือ "constexpr" บางทีคุณอาจลองแบบนี้:
constexpr int b = 4; // can't be assigned from a!
int d[b];
"constexpr" แทนหมายถึง "const จริง" และ "const" เท่านั้นหมายถึง "var ที่ไม่เปลี่ยนแปลง" เพราะเหตุผลทางประวัติศาสตร์บางอย่าง โปรดทราบว่าอาร์เรย์ดั้งเดิมใน c ++ จะมีความยาวคงที่เสมอตามที่ @Bathsheba กล่าว
คำว่า "คงที่" นั้นคลุมเครือจริงๆและคำหลักconstนั้นทำให้เข้าใจผิด
constหมายถึง: "ไม่อนุญาตให้ค่าของวัตถุนี้จะไม่เปลี่ยนแปลงหลังจากการเริ่มต้น" ไม่ได้แปลว่า "ค่าคงที่เวลารวบรวม" ค่าเริ่มต้นสามารถ (และโดยปกติแล้ว) ยังมาจากแหล่งรันไทม์
คุณต้องมีค่าคงที่เวลารวบรวมสำหรับอาเรย์ที่ถูกผูกไว้
บางครั้งมีความเป็นไปได้ที่จะมีชื่อวัตถุfooที่เป็นค่าคงที่เวลารวบรวมถ้าเป็นconst และมันถูกกำหนดค่าเริ่มต้นจากนิพจน์คงที่เช่นตัวอักษรหรือconstexprสิ่งของ นั่นเป็นกรณีสำหรับc; bมันไม่ได้เป็นกรณีที่