2017-01-03 24 views
6

Theo cppreference phần Lõi biểu thức hằng số điểm 19) một nhà điều hành phép trừ giữa hai con trỏ không phải là quy phạm pháp luật liên tục biểu cho đến khi C++ 14. Tôi có thể giả định rằng mã sau đây là mã C++ 17 hợp pháp hay liệu đây có phải là một sự lạm dụng?Sự khác biệt giữa hai con trỏ hợp pháp C++ 17 biểu thức không đổi?

int X, Y; 

template <long long V> 
struct S { }; 

int main() { 
    S<&X - &Y> s; 
    (void)s; 
} 

Trả lời

14

Câu hỏi là tranh luận. Con trỏ arithmetics chỉ được định nghĩa trên con trỏ thuộc cùng một mảng, mà chắc chắn không phải là trường hợp đó. Vì vậy, mã ở trên là không hợp pháp C++ và trên thực tế, không biên dịch được với trình biên dịch có sẵn cho tôi.

+0

Hoặc hai con trỏ null IIRC, cũng là chắc chắn không phải là trường hợp. – hvd

+1

Vì vậy, tôi đã diễn giải quá mức từ ngữ? Vâng, tôi đã thử nghiệm nó quá nhưng tôi đã học được rằng thực tế một cái gì đó không biên dịch trong trình biên dịch đưa ra không thực sự quan tâm nó thực sự là không hợp pháp do đó câu hỏi :) –

+0

@ hvd, tôi không nhớ bất kỳ ngoại lệ cho con trỏ null về trừ nhưng trí nhớ của tôi có thể thất bại. Bạn sẽ rất tử tế để cung cấp một báo giá? – SergeyA

3

Các trích dẫn cppref article nói

Một lõi biểu thức hằng số bất kỳ biểu hiện mà không có bất kỳ một trong các cách sau ..

7) Một biểu thức mà đánh giá dẫn đến bất kỳ hình thức cốt lõi ngôn ngữ (từ C++ 17) hành vi không xác định (bao gồm tràn số nguyên đã ký, chia cho số không, số học con trỏ bên ngoài mảng bị ràng buộc s, v.v ...) Cho dù phát hiện hành vi không xác định thư viện chuẩn là chưa được chỉ định. (Vì C++ 17)

19) một nhà điều hành phép trừ giữa hai con trỏ (cho đến khi C++ 14)

có khả năng chỉ mảng ptr arithemtics bên trong ranh giới mảng là nhận 'hợp pháp hóa' từ C++ 14 , không phải tất cả con trỏ arithmetics


Trên thực tế một demo cho thấy mảng ptr arithmetics biên dịch ổn ngay cả với C++ 11 (không C++ 98)

Các vấn đề liên quan