ทำไมประเภทนิพจน์จึงเปลี่ยนเป็น C ++ ระหว่างเวอร์ชัน?


13

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

ในต่อไปนี้ฉันหมายถึงร่างต่อไปนี้:

  • C ++ 11 [ n3690 ] (ร่างสุดท้าย)
  • C ++ 17 [ n4659 ] (ร่างสุดท้าย)
  • C ++ 20 [ n4835 ] (ร่างปัจจุบัน)

C++11 3.10 ค่าและค่า

... prvalue (“ pure” rvalue) คือ rvalue ที่ไม่ใช่ xvalue [ตัวอย่าง: ผลลัพธ์ของการเรียกฟังก์ชั่นที่มีประเภทส่งคืนไม่ใช่การอ้างอิงคือ prvalue ค่าของตัวอักษรเช่น 12, 7.3e5 หรือความจริงก็เป็นที่แพร่หลาย - ตัวอย่างท้าย]

C++17 3.10 ค่าและค่า

... prvalue เป็นนิพจน์ที่การประเมินค่าเริ่มต้นวัตถุหรือบิตฟิลด์หรือคำนวณค่าของตัวถูกดำเนินการของผู้ดำเนินการตามที่ระบุโดยบริบทที่ปรากฏ

C++20 7.2.1 หมวดหมู่ค่า *

... prvalue คือนิพจน์ซึ่งการประเมินค่าเริ่มต้นวัตถุหรือบิตฟิลด์หรือคำนวณค่าของตัวถูกดำเนินการของโอเปอเรเตอร์ตามที่ระบุโดยบริบทที่ปรากฏหรือนิพจน์ที่มีชนิด cv void

ฉันจะเข้าใจการเปลี่ยนแปลงถ้อยคำและมีการปรับปรุงบางอย่าง แต่สำหรับฉันการเปลี่ยนแปลงคำจำกัดความทั้งหมด มีคนช่วยฉันเข้าใจเรื่องนี้ไหม? ตัวอย่างเช่นทำไมประโยคถูกลบออกว่า prvalue เป็น rvalue ที่ไม่ใช่ xvalue หรือทำไมตัวอย่างที่เป็นประโยชน์จึงถูกลบออกไป?


3
ฉันทั้งหมดกำลังห้ามแท็กภาษาเฉพาะเวอร์ชัน ยกเว้นคำถามประเภทนี้อย่างแน่นอน
curiousguy


" อย่าคำนึงว่าการใช้ถ้อยคำและคำจำกัดความระหว่างเวอร์ชัน C ++ จะเปลี่ยนแปลงไปอย่างมาก " แต่คำนิยามนั้นไม่เปลี่ยนแปลง การแสดงออกค่อนข้างมากที่เป็น prvalue ใน C ++ 11 ยังคงเป็น prvalue ใน C ++ 20
Nicol Bolas

'ความขัดแย้ง (ไอออน)' ระหว่างเวอร์ชันอยู่ที่ไหน คำถามของคุณคืออะไร
กาแล็กซี่

1
ขออภัยสำหรับการเปลี่ยนแปลง C ++ 20แต่ฉันสังเกตเห็นความไม่สอดคล้องในมาตรฐาน
Maggyero

คำตอบ:


5

คำนิยาม prvalue ดั้งเดิมเป็นเพียงแค่ป้ายกำกับ: เรากำหนดค่า rvalues ​​บางอย่าง (นั่นคือค่าที่ไม่ใช่ xvalues) และตั้งชื่อให้พวกเขา มันเป็นไปไม่ได้ที่จะใช้ที่อยู่ของพวกเขายกเว้นผ่านthisการใช้งานที่ผิดปกติ(มากหรือน้อยเพราะพวกมันเป็นเวลาชั่วคราว) ดังนั้นจึงสามารถนำเสรีภาพบางอย่างไปใช้กับการสร้างและการเผยแพร่โดยไม่ทำลายอะไรเลย (โปรดดูการสนทนาล่าสุดของพวกเขาที่ไม่“ มีตัวตน”)

คำจำกัดความใหม่บอกอย่างชัดเจนว่า prvalue เป็นการเริ่มต้น“ รอให้เกิดขึ้น”: เมื่อระบุวัตถุเป้าหมายแล้วสิ่งนั้นจะได้รับการกำหนดค่าเริ่มต้น (เป็นสิ่งสำคัญที่จะต้องทราบว่าการเริ่มต้นยังคงเกิดขึ้นเมื่อ prvalue ถูกสร้างขึ้นไม่ใช่ที่ที่มันอยู่) สิ่งนี้ไปโดยใช้ชื่อของ

ตัวอย่างเช่นนิยามหมวดหมู่ค่าใหม่ถูกมองว่าเป็นเรื่องที่ง่ายกว่ามากและต้องการตัวอย่างน้อยลง ยังคงมีหนึ่งค่าสำหรับ xvalues ​​(ซึ่งเป็นหมวดหมู่ย่อย)


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