Có được phép thêm số 0 vào con trỏ null không?


9

Tôi biết rằng số học con trỏ không được phép cho con trỏ null. Nhưng hãy tưởng tượng tôi có một cái gì đó như thế này:

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)

Có thể (được phép) để end()thực hiện ở trên ? Hoặc là cần thiết phải có:

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

để tránh số học con trỏ với nullptr vì arrayBeginnull cho một mảng trống (mặc dù arraySizecũng bằng 0 trong trường hợp này)?

Tôi biết có thể lưu trữ int *end;thay vì unsigned size;và để kích thước được tính như end-begin- nhưng sau đó lại xuất hiện cùng một vấn đề: Có được phép tính toán nullptr - nullptrkhông?

Tôi đặc biệt đánh giá cao tài liệu tham khảo tiêu chuẩn.

Câu trả lời:


8

Có, bạn có thể thêm số không vào con trỏ null và trừ đi một con trỏ null từ con trỏ khác. Trích dẫn phần Toán tử phụ gia [expr.add] của tiêu chuẩn C ++:

Khi một biểu thức Jcó kiểu nguyên được thêm vào hoặc trừ đi từ biểu thức Pcủa kiểu con trỏ, kết quả có kiểu P.

  • Nếu Pước tính thành giá trị con trỏ null và Jước tính thành 0, kết quả là giá trị con trỏ null.

8
"8,7 7" là gì? Nếu bạn tham khảo Tiêu chuẩn C ++, vui lòng chỉ định cái nào. Nói chung, tốt hơn là sử dụng phần "tên" trong ngoặc đơn, vì phần đánh số phần / chương / đoạn thường thay đổi theo từng phiên bản Tiêu chuẩn. Trong dự thảo hiện tại, phần có liên quan là [expr.add] đoạn 4.15.1 .
Daniel Langr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.