Aunque no puedo encontrar ninguna mención explícita en este Borrador de Trabajo Estándar C ++ (de 2014) que la conversión de std::nullptr_t
a un tipo integral esté prohibida, ¡tampoco se menciona que tal conversión esté permitida!
Sin embargo, el caso de conversión de std::nullptr_t
a bool
se menciona explícitamente:
4.12 Conversiones booleanas
Un valor de aritmética, enumeración sin alcance, puntero o puntero a tipo de miembro se puede convertir a un valor de tipo bool. Un valor cero, un valor de puntero nulo o un valor de puntero de miembro nulo se convierte en falso; cualquier otro valor se convierte en verdadero. Para la inicialización directa (8.5), un valor prva de tipo std :: nullptr_t se puede convertir en un valor prva de tipo bool; El valor resultante es falso.
Además, el único lugar en este documento borrador donde se menciona la conversión de std::nullptr_t
a un tipo integral, es en la sección "reinterpret_cast":
5.2.10 Reinterpret cast
...
(4) Un puntero se puede convertir explícitamente a cualquier tipo integral lo suficientemente grande como para contenerlo. La función de mapeo está definida por la implementación. [Nota: no pretende sorprender a quienes conocen la estructura de direccionamiento de la máquina subyacente. - nota final] Un valor de tipo std :: nullptr_t puede convertirse en un tipo integral; la conversión tiene el mismo significado y validez que una conversión de (void *) 0 al tipo integral. [Nota: un reinterpret_cast no se puede usar para convertir un valor de ningún tipo al tipo std :: nullptr_t. - nota final]
Entonces, a partir de estas dos observaciones, uno podría (IMHO) suponer razonablemente que el MSVC
compilador es correcto.
EDITAR : Sin embargo, su uso del "reparto de notación funcional" en realidad puede sugerir lo contrario. El MSVC
compilador no tiene ningún problema al usar una conversión de estilo C, por ejemplo:
uintptr_t answer = (uintptr_t)(nullptr);
pero (como en su código), se queja de esto:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
Sin embargo, del mismo Proyecto de Norma:
5.2.3 Conversión de tipo explícita (notación funcional)
(1) Un especificador de tipo simple (7.1.6.2) o un especificador de nombre de tipo (14.6) seguido de una lista de expresiones entre paréntesis construye un valor del tipo especificado dada la lista de expresiones. Si la lista de expresiones es una sola expresión, la expresión de conversión de tipo es equivalente (en definición, y si está definida en significado) a la expresión de conversión correspondiente (5.4). ...
La "expresión de conversión correspondiente (5.4)" puede referirse a una conversión de estilo C.