Mặc dù tôi không thể tìm thấy đề cập rõ ràng nào trong Tiêu chuẩn Dự thảo C ++ này (từ 2014) rằng việc chuyển đổi từ std::nullptr_t
loại tích phân bị cấm, nhưng cũng không có đề cập đến việc chuyển đổi như vậy được cho phép!
Tuy nhiên, trường hợp chuyển đổi từ std::nullptr_t
sang bool
được đề cập rõ ràng:
4.12 Chuyển đổi Boolean
Một giá trị của số học, liệt kê không theo tỷ lệ, con trỏ hoặc con trỏ thành loại thành viên có thể được chuyển đổi thành giá trị của loại bool. Giá trị 0, giá trị con trỏ null hoặc giá trị con trỏ null được chuyển thành false; bất kỳ giá trị nào khác được chuyển đổi thành true. Đối với khởi tạo trực tiếp (8.5), một giá trị của loại std :: nullptr_t có thể được chuyển đổi thành một giá trị của loại bool; giá trị kết quả là sai.
Hơn nữa, vị trí duy nhất trong tài liệu dự thảo này có chuyển đổi từ std::nullptr_t
loại tích phân được đề cập, là trong phần "reinterpret_cast":
5.2.10 Diễn giải lại
...
(4) Một con trỏ có thể được chuyển đổi rõ ràng thành bất kỳ loại tích phân nào đủ lớn để giữ nó. Hàm ánh xạ được xác định theo thực hiện. [Lưu ý: Dự định sẽ không gây ngạc nhiên cho những người biết cấu trúc địa chỉ của máy bên dưới. - lưu ý cuối] Giá trị của loại std :: nullptr_t có thể được chuyển đổi thành loại tích phân; chuyển đổi có cùng ý nghĩa và hiệu lực như chuyển đổi (void *) 0 thành loại tích phân. [Lưu ý: Không thể sử dụng reinterpret_cast để chuyển đổi giá trị của bất kỳ loại nào thành loại std :: nullptr_t. - lưu ý cuối]
Vì vậy, từ hai quan sát này, người ta có thể (IMHO) phỏng đoán một cách hợp lý rằng MSVC
trình biên dịch là chính xác.
EDIT : Tuy nhiên, việc bạn sử dụng "ký hiệu chức năng" thực sự có thể gợi ý ngược lại! Trình MSVC
biên dịch không có vấn đề gì khi sử dụng kiểu C, ví dụ:
uintptr_t answer = (uintptr_t)(nullptr);
nhưng (như trong mã của bạn), nó phàn nàn về điều này:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
Tuy nhiên, từ cùng một Tiêu chuẩn Dự thảo:
5.2.3 Chuyển đổi loại rõ ràng (ký hiệu chức năng)
(1) Trình xác định kiểu đơn giản (7.1.6.2) hoặc kiểu chữ-specifier (14.6) theo sau là danh sách biểu thức được ngoặc đơn xây dựng một giá trị của kiểu đã chỉ định cho danh sách biểu thức. Nếu danh sách biểu thức là một biểu thức đơn, biểu thức chuyển đổi loại là tương đương (theo định nghĩa và nếu được định nghĩa theo nghĩa) với biểu thức truyền tương ứng (5.4). ...
"Biểu thức diễn viên tương ứng (5.4)" có thể đề cập đến một kiểu đúc C.