Meskipun saya tidak dapat menemukan penyebutan eksplisit dalam Standar Draf C ++ Kerja ini (mulai 2014) bahwa konversi dari std::nullptr_t
ke tipe integral dilarang, ada juga tidak menyebutkan bahwa konversi semacam itu diperbolehkan!
Namun, kasus konversi dari std::nullptr_t
ke bool
adalah eksplisit disebutkan:
4.12 Konversi Boolean
Nilai awal aritmatika, enumerasi yang tidak dicentang, penunjuk, atau penunjuk ke tipe anggota dapat dikonversi ke nilai awal tipe bool. Nilai nol, nilai pointer nol, atau nilai pointer anggota null dikonversi menjadi false; nilai lain dikonversi menjadi true. Untuk inisialisasi langsung (8.5), nilai dari tipe std :: nullptr_t dapat dikonversi ke nilai awal tipe bool; nilai yang dihasilkan salah.
Lebih jauh, satu - satunya tempat dalam draft dokumen ini di mana konversi dari std::nullptr_t
ke tipe integral disebutkan, ada di bagian "reinterpret_cast":
5.2.10 Menafsirkan kembali cast
...
(4) Suatu pointer dapat secara eksplisit dikonversi ke tipe integral yang cukup besar untuk menahannya. Fungsi pemetaan ditentukan oleh implementasi. [Catatan: Ini dimaksudkan untuk tidak mengejutkan bagi mereka yang tahu struktur pengalamatan mesin yang mendasarinya. - end note] Nilai tipe std :: nullptr_t dapat dikonversi ke tipe integral; konversi memiliki arti dan validitas yang sama dengan konversi (batal *) 0 ke tipe integral. [Catatan: Reinterpret_cast tidak dapat digunakan untuk mengonversi nilai tipe apa pun menjadi tipe std :: nullptr_t. - catatan akhir]
Jadi, dari dua pengamatan ini, salah satu bisa (IMHO) cukup dugaan bahwa MSVC
compiler benar.
EDIT : Namun, penggunaan "notasi fungsional" Anda sebenarnya dapat menyarankan sebaliknya! The MSVC
compiler tidak memiliki masalah menggunakan cor C-gaya, misalnya:
uintptr_t answer = (uintptr_t)(nullptr);
tetapi (seperti dalam kode Anda), ia mengeluh tentang ini:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
Namun, dari Draf Standar yang sama:
5.2.3 Konversi tipe eksplisit (notasi fungsional)
(1) Sebuah specifier tipe sederhana (7.1.6.2) atau specename-specifier (14.6) diikuti oleh daftar ekspresi yang dipatenkan membangun nilai dari tipe yang ditentukan diberikan daftar ekspresi. Jika daftar ekspresi adalah ekspresi tunggal, ekspresi konversi tipe adalah setara (dalam definisi, dan jika didefinisikan dalam arti) dengan ekspresi cast yang sesuai (5.4). ...
"Ekspresi pemeran yang sesuai (5,4)" dapat merujuk pada pemeran gaya-C.