ฉันสามารถกำหนดความยาวของอาร์เรย์โดยใช้ค่าคงที่ดังนั้นทำไม int d [b] จึงไม่ทำงาน


11
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?

คำตอบ:


16

อะไรคือความแตกต่างระหว่าง b และ c

c มีเวลาเริ่มต้นคงที่คอมไพล์ในขณะที่ b ไม่มี วัตถุ const ที่มีค่าเริ่มต้นคงที่เวลาคอมไพล์เป็นตัวเองเป็นค่าคงที่เวลารวบรวม

เนื่องจากฉันสามารถกำหนดหนึ่งในสิบของ arry โดยใช้ค่าคงที่ดังนั้นทำไมจึงใช้งานไม่ได้

ไม่ใช่แค่ค่าคงที่เท่านั้นที่จะทำ constqualifier หมายถึง constness runtime (เช่นค่าอาจถูกกำหนดที่ runtime แต่จะไม่เปลี่ยนแปลงตลอดอายุการใช้งานของวัตถุ) สามารถใช้เฉพาะค่าคงที่ของเวลาในการรวบรวมเป็นขนาดอาร์เรย์


6

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


4

การวินิจฉัยคอมไพเลอร์ควรเป็นเวลารวบรวมนิพจน์ค่าคงที่ที่ประเมินได้จริง ๆ

เนื่องจากวัตถุเดิมที่bได้รับมอบหมายไม่ได้const, bไม่ได้เป็นเวลารวบรวมการแสดงออก evaluable คงที่ดังนั้นการรวบรวมจะล้มเหลวเป็นอาร์เรย์ตัวแปรความยาวยังไม่ได้รับการสนับสนุนในมาตรฐาน C ++


1

"const" เพียงแค่หมายความว่าตัวแปรจะไม่เปลี่ยนแปลง ณ รันไทม์และไม่ได้หมายความว่าค่าของมันสามารถสรุปได้ในเวลารวบรวม

ฉันเดาสิ่งที่คุณกำลังมองหาคือ "constexpr" บางทีคุณอาจลองแบบนี้:

constexpr int b = 4; // can't be assigned from a!
int d[b];

"constexpr" แทนหมายถึง "const จริง" และ "const" เท่านั้นหมายถึง "var ที่ไม่เปลี่ยนแปลง" เพราะเหตุผลทางประวัติศาสตร์บางอย่าง โปรดทราบว่าอาร์เรย์ดั้งเดิมใน c ++ จะมีความยาวคงที่เสมอตามที่ @Bathsheba กล่าว


คุณกำลังพูดถึง "ภาษาอื่น"
ไบรอัน

1
@Brian ขออภัยมันไม่เกี่ยวข้อง ฉันเปลี่ยนคำตอบ
Leon

"ไม่มีสกอตตัวจริง ... " - ให้ฉันไม่เห็นด้วยกับ"constexpr"ของคุณแทนหมายถึง "const จริง" และ "const" เท่านั้นหมายถึงคำสั่ง"var ที่ไม่เปลี่ยนแปลง" "const" หมายถึง "const", "constexpr" หมายถึง "constexpr" - พวกเขามีความหมายและความหมายที่แตกต่างกันสองประการในบริบทของภาษา c ++ "const" หมายถึง"ไม่สามารถแก้ไขวัตถุ" , "constexpr" หมายถึง"เป็นไปได้ที่จะประเมินค่าของฟังก์ชั่นหรือตัวแปรในเวลารวบรวม"
CharonX

ขออภัยฉันอาจแสดงอย่างไม่ถูกต้อง ภาษาอังกฤษไม่ใช่ภาษาแม่ของฉัน
Leon

1

คำว่า "คงที่" นั้นคลุมเครือจริงๆและคำหลักconstนั้นทำให้เข้าใจผิด

constหมายถึง: "ไม่อนุญาตให้ค่าของวัตถุนี้จะไม่เปลี่ยนแปลงหลังจากการเริ่มต้น" ไม่ได้แปลว่า "ค่าคงที่เวลารวบรวม" ค่าเริ่มต้นสามารถ (และโดยปกติแล้ว) ยังมาจากแหล่งรันไทม์

คุณต้องมีค่าคงที่เวลารวบรวมสำหรับอาเรย์ที่ถูกผูกไว้

บางครั้งมีความเป็นไปได้ที่จะมีชื่อวัตถุfooที่เป็นค่าคงที่เวลารวบรวมถ้าเป็นconst และมันถูกกำหนดค่าเริ่มต้นจากนิพจน์คงที่เช่นตัวอักษรหรือconstexprสิ่งของ นั่นเป็นกรณีสำหรับc; bมันไม่ได้เป็นกรณีที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.