มันอนุญาตให้เพิ่มศูนย์เป็นตัวชี้โมฆะหรือไม่


9

ฉันรู้ว่าเลขคณิตตัวชี้นั้นไม่ได้รับอนุญาตสำหรับพอยน์เตอร์พอยน์เตอร์ แต่ลองนึกภาพฉันมีสิ่งนี้:

class MyArray {
  int *arrayBegin;  // pointer to the first array item, NULL for an empty array
  unsigned arraySize;   // size of the array, zero for an empty array
public:
  int *begin() const { return arrayBegin; }
  int *end() const { return arrayBegin + arraySize; }  // possible? (arrayBegin may be null)

เป็นไปได้ (อนุญาต) ให้มีการend()ใช้งานข้างต้นหรือไม่ หรือจำเป็นต้องมี:

  int *end() const { return (arraySize == 0) ? nullptr : (arrayBegin + arraySize); }

การหลีกเลี่ยงตัวชี้ทางคณิตศาสตร์ด้วย nullptr เพราะarrayBeginเป็นโมฆะสำหรับอาร์เรย์ว่างเปล่า (แม้จะarraySizeเป็นศูนย์ในกรณีนี้)?

ฉันรู้ว่าเป็นไปได้ในการจัดเก็บint *end;แทนunsigned size;และอนุญาตให้คำนวณขนาดเป็นend-begin- แต่แล้วก็มีปัญหาเดียวกัน: อนุญาตให้คำนวณได้nullptr - nullptrหรือไม่

ฉันจะขอขอบคุณอ้างอิงมาตรฐาน

คำตอบ:


8

ใช่คุณสามารถเพิ่มศูนย์ให้กับตัวชี้โมฆะและลบหนึ่งตัวชี้โมฆะจากอีก การอ้างอิงตัวดำเนินการเพิ่มเติม[expr.add]ของมาตรฐาน C ++:

เมื่อมีการแสดงออกJที่มีประเภทหนึ่งคือการเพิ่มหรือลบออกจากการแสดงออกของประเภทตัวชี้ผลที่มีประเภทของPP

  • หากPประเมินเป็นค่าตัวชี้ null และJประเมินเป็น 0 ผลลัพธ์จะเป็นค่าตัวชี้ null

8
"8.7 7" คืออะไร หากคุณอ้างถึงมาตรฐาน C ++ โปรดระบุว่าอันไหน โดยทั่วไปแล้วจะเป็นการดีกว่าถ้าจะใช้ส่วน "ชื่อ" ในวงเล็บเนื่องจากหมายเลขส่วน / บท / / ย่อหน้าจะเปลี่ยนไปตามรุ่นมาตรฐานแต่ละรุ่น ในร่างปัจจุบันส่วนที่เกี่ยวข้องคือ [expr.add] ย่อหน้า4.1และ5.1
Daniel Langr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.