Bu Çalışma Taslağı C ++ Standardında (2014'ten) ayrılmaz bir türe dönüştürmenin yasak olduğu konusunda açık bir söz bulamamam da, böyle bir dönüşüme izin verildiğini de belirtmiyorum!std::nullptr_t
Ancak, std::nullptr_t
ila arasında dönüşüm bool
durumu açıkça belirtilmiştir:
4.12 Boole dönüşümleri
Aritmetik, kodlanmamış numaralandırma, işaretçi ya da işaretçi ile üye türünün bir ön değeri, bool türünün bir ön değerine dönüştürülebilir. Sıfır değeri, null işaretçi değeri veya null üye işaretçi değeri false değerine dönüştürülür; diğer herhangi bir değer true değerine dönüştürülür. Doğrudan başlatma (8.5) için, std :: nullptr_t türünde bir ön değer, bool türünde bir ön değere dönüştürülebilir; elde edilen değer yanlıştır.
Ayrıca, bu taslak belgede , integral tipine dönüştürmenin geçtiği tek yer std::nullptr_t
"reinterpret_cast" bölümünde yer almaktadır:
5.2.10 Dökümü yeniden
yorumlayın
...
(4) Bir işaretçi, açıkça tutacak kadar büyük tümleşik tiplere dönüştürülebilir. Eşleme işlevi uygulama tanımlıdır. [Not: Altta yatan makinenin adresleme yapısını bilenler için şaşırtıcı değildir. - end note] std :: nullptr_t türünde bir değer bir integral türüne dönüştürülebilir; dönüşüm, (void *) 0'ın integral türüne dönüştürülmesi ile aynı anlama ve geçerliliğe sahiptir. [Not: reinterpret_cast, herhangi bir türdeki değeri std :: nullptr_t türüne dönüştürmek için kullanılamaz. - son not]
Bu nedenle, bu iki gözlemden biri , derleyicinin doğru olduğunu makul olarak tahmin edebilir (IMHO) MSVC
.
DÜZENLEME : Ancak, "işlevsel gösterim" kullanımınız aslında tam tersi olabilir! MSVC
Derleyici örneğin, C tarzı döküm kullanarak bir sorunu yok:
uintptr_t answer = (uintptr_t)(nullptr);
ancak (kodunuzda olduğu gibi), bundan şikayet eder:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
Yine de, aynı Taslak Standarttan:
5.2.3 Açık tür dönüşümü (işlevsel gösterim)
(1) Basit tür belirteci (7.1.6.2) veya tür adı belirleyicisi (14.6) ve ardından parantez içine alınmış bir ifade listesi, ifade listesi verildiğinde belirtilen türde bir değer oluşturur. İfade listesi tek bir ifadeyse, tür dönüştürme ifadesi karşılık gelen döküm ifadesine (5.4) eşdeğerdir (tanım olarak ve anlam olarak tanımlanmışsa). ...
"Karşılık gelen döküm ifadesi (5.4)", C tarzı bir döküm anlamına gelebilir.