unique_ptr <0 HOẶC ít hơn toán tử làm gì?


9

Tôi đang xử lý mã đã được viết không phải bởi tôi. Tôi có tuyên bố này:

// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }

Vậy p < 0trong bối cảnh này có nghĩa là gì?
Trên trang tài liệu , tôi tin rằng trường hợp của tôi là 16) y < nullptr, nơi 0nullptr.

Nhưng nó làm gì?


1
Dựa trên thực tế là, trong x64, các con trỏ chính tắc trong phạm vi kernel có tập bit trên, nó có thể là một cách (ngu ngốc được mã hóa) để kiểm tra xem một con trỏ có thuộc không gian kernel hay không - nếu câu trả lời bên dưới là chính xác, thì không .
Michael Chourdakis

1
Trong WINAPI p==-1là một xử lý không hợp lệ. Vì 2^64là một con số khổng lồ lố bịch nên bất kỳ sự hợp lý pnào cũng luôn tích cực. Vì vậy, p<0kiểm tra xử lý không hợp lệ của WINAPI. Đây không phải là một mã tốt.
ALX23z

@OP: Bạn có thể làm rõ một chút trong bối cảnh mà mã này được sử dụng? Nó được sử dụng trên Linux hay Windows? Giá trị của con trỏ có liên quan đến một số mã WINAPI không? Tôi nghĩ rằng nếu bạn làm rõ điều đó, các ý kiến ​​trên có thể là câu trả lời tốt.
quả óc chó

@ ALX23z Nhưng một tay cầm WINAPI có phải là loại uint8_t*(hoặc thậm chí là mảng uint8_t) không? Tôi nghĩ rằng họ là void*, phải không?
quả óc chó

@walnut họ không void*có macro HANDLE_PTR hoặc một cái gì đó về cơ bản là long*iirc.
ALX23z

Câu trả lời:


2

unique_ptr <0 HOẶC ít hơn toán tử làm gì?

Nó phù hợp với tình trạng quá tải (11) trên cppreference operator<(const unique_ptr&, nullptr_t);. 0 ngầm chuyển thành std::nullptr_t. Theo tài liệu, kết quả là std::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr).

Kết quả là việc thực hiện được xác định, nhưng sai vô điều kiện trên hầu hết các hệ thống. Có lẽ trên một hệ thống kỳ lạ nơi null không có biểu diễn nhị phân bằng 0, kết quả có thể đúng.

Tôi tin rằng trường hợp của tôi là 16)

(16) là cách tương tự khác xung quanh : 0 > unique_ptr. Kết quả là như nhau.


Nhưng được 0xem xét nullptrbởi trình biên dịch? Tôi nghĩ đó là những gì anh ấy tự hỏi. Điều đó cũng không có ý nghĩa với tôi.
thay đổi

@alteredinstance 0 không được "xem xét" nullptr(hoặc phụ thuộc vào ý của bạn khi xem xét). 0 ngầm chuyển thành std::nullptr_t.
eerorika

Đó là những gì tôi giả định. Tôi tự hỏi nếu có bất kỳ tài liệu nào về việc chuyển đổi ngầm 0thành nullptr, vì tôi chỉ thấy hai tương thích với các so sánh boolean. Chúng có thể so sánh được, nhưng tôi có ấn tượng rằng chúng không thể chuyển đổi.
thay đổi

@alteredinstance Việc chuyển đổi không xảy ra theo cách khác. int x = nullptrbị bệnh hình thành.
eerorika

2
@alteredinstance std::nullptr_tđược thiết kế để có thể sử dụng với bất kỳ con trỏ null nào; không chỉ nullptr. 0 (cũng như 0L chẳng hạn) là các hằng số con trỏ null, vì vậy người ta có thể sử dụng chúng để tạo ra một std::nullptr_t.
eerorika

2

Kiểm tra xem operator <không bị quá tải ở đâu đó trong cơ sở mã của bạn. Đó dường như là cách duy nhất (p < 0)có thể true.

Thí dụ:

bool operator< (const std::unique_ptr<uint8_t[]>&, int) { return true; }

int main() {
    std::unique_ptr<uint8_t[]> p;
    std::cout << (p < 0) << std::endl;
}

Bản in:

1

bản thử trực tiếp

Mặt khác, như những người khác đã nói, 0hoàn toàn chuyển đổi thành std::nullptr_t, sẽ chọn bool operator<(const unique_ptr<T, D>& x, nullptr_t)quá tải sẽ gọi std::less(p, 0)lại false(ngay cả trên Windows với -1giá trị con trỏ).


Nó không nhất thiết phải trở lại false. Nó là định nghĩa triển khai hoặc không xác định (tôi không chắc chắn.) Nhưng tôi đồng ý rằng nó có thể sẽ trả falsevề hầu hết (tất cả?) Việc triển khai. Xem thêm câu trả lời của @eerorika
quả óc chó

0

Biểu thức này khớp với toán tử mẫu này (0 đang được chuyển đổi thành nullptr):

template <class T, class D>
bool operator<(const unique_ptr<T, D>& x, nullptr_t);

Điều này trả về std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)luôn luôn là sai (như std::lesslà một functor thứ tự nghiêm ngặt) ( bản demo ).


Nó không luôn luôn trở lại false. Cho dù đó là xác định thực hiện hoặc không xác định. Nó có thể luôn luôn trở lại falsemặc dù trên hầu hết (tất cả?) Các triển khai hiện tại.
quả óc chó

@walnut Trừ khi một câu hỏi hỏi rõ ràng về những gì Tiêu chuẩn nói ( ví dụ thông qua thẻ luật sư ngôn ngữ ), tôi cố gắng trả lời từ quan điểm thực tế. Tất cả thực hiện thực tế std::lesstrở lại false.
YSC

Điều đó là tốt, tôi chỉ không tìm thấy lý do của bạn (" như std :: less là một functor trật tự nghiêm ngặt ") thuyết phục. Nó có thể là một trật tự nghiêm ngặt mà không trở lại false. Lý do thực tế sẽ là giá trị con trỏ 0 được biểu thị bằng địa chỉ thấp nhất có thể hoặc một cái gì đó dọc theo các dòng đó.
quả óc chó
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.