Anche se non trovo alcuna menzione esplicita in questo Working Craft Standard C ++ (dal 2014) che la conversione da std::nullptr_t
un tipo integrale è vietata, non si fa menzione del fatto che tale conversione è consentita!
Tuttavia, il caso della conversione da std::nullptr_t
a bool
viene esplicitamente menzionato:
4.12 Conversioni booleane
Un valore di aritmetica, enumerazione senza ambito, puntatore o puntatore al tipo di membro può essere convertito in un valore di tipo bool. Un valore zero, un valore del puntatore nullo o un valore del puntatore del membro null viene convertito in false; qualsiasi altro valore viene convertito in vero. Per l'inizializzazione diretta (8.5), un valore di tipo std :: nullptr_t può essere convertito in un valore di tipo bool; il valore risultante è falso.
Inoltre, l' unico posto in questo progetto di documento in cui std::nullptr_t
è menzionata la conversione da un tipo integrale, è nella sezione "reinterpret_cast":
5.2.10 Reinterpretare il cast
...
(4) Un puntatore può essere esplicitamente convertito in qualsiasi tipo integrale abbastanza grande da mantenerlo. La funzione di mappatura è definita dall'implementazione. [Nota: si intende che non sorprenda chi conosce la struttura di indirizzamento della macchina sottostante. - end note] Un valore di tipo std :: nullptr_t può essere convertito in un tipo integrale; la conversione ha lo stesso significato e validità di una conversione di (void *) 0 nel tipo integrale. [Nota: un reinterpret_cast non può essere utilizzato per convertire un valore di qualsiasi tipo nel tipo std :: nullptr_t. - nota finale]
Quindi, da queste due osservazioni, si potrebbe ragionevolmente supporre (IMHO) che il MSVC
compilatore sia corretto.
EDIT : Tuttavia, l'uso del "cast di notazione funzionale" può effettivamente suggerire il contrario! Il MSVC
compilatore non ha problemi a utilizzare un cast in stile C, ad esempio:
uintptr_t answer = (uintptr_t)(nullptr);
ma (come nel tuo codice), si lamenta di questo:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
Tuttavia, dallo stesso Draft Standard:
5.2.3 Conversione di tipo esplicita (notazione funzionale)
(1) Un identificatore di tipo semplice (7.1.6.2) o un identificatore di nome (14.6) seguito da un elenco di espressioni tra parentesi costruisce un valore del tipo specificato dato l'elenco di espressioni. Se l'elenco di espressioni è una singola espressione, l'espressione di conversione del tipo è equivalente (nella definizione e se definita nel significato) all'espressione di cast corrispondente (5.4). ...
L'espressione "cast corrispondente" (5.4) "può fare riferimento a un cast in stile C.