Embora eu não encontre menção explícita neste Padrão de Trabalho C ++ (de 2014) de que a conversão de std::nullptr_t
para um tipo integral é proibida, também não há menção de que essa conversão seja permitida!
No entanto, o caso de conversão de std::nullptr_t
para bool
é mencionado explicitamente:
4.12 Conversões booleanas
Um pré-valor de aritmética, enumeração sem escopo, ponteiro ou ponteiro para o tipo de membro pode ser convertido em um pré-valor do tipo bool. Um valor zero, um valor de ponteiro nulo ou um valor de ponteiro de membro nulo é convertido em falso; qualquer outro valor é convertido em true. Para inicialização direta (8.5), um pré-valor do tipo std :: nullptr_t pode ser convertido em um pré-valor do tipo bool; o valor resultante é falso.
Além disso, o único lugar neste documento de rascunho em que a conversão de std::nullptr_t
para um tipo integral é mencionada é na seção "reinterpret_cast":
5.2.10 Reinterpretar
a conversão
...
(4) Um ponteiro pode ser convertido explicitamente em qualquer tipo integral grande o suficiente para segurá-lo. A função de mapeamento é definida pela implementação. [Nota: O objetivo é não surpreender quem conhece a estrutura de endereçamento da máquina subjacente. - nota final] Um valor do tipo std :: nullptr_t pode ser convertido em um tipo integral; a conversão tem o mesmo significado e validade que uma conversão de (vazio *) 0 para o tipo integral. [Nota: Um reinterpret_cast não pode ser usado para converter um valor de qualquer tipo no tipo std :: nullptr_t. - nota final]
Portanto, a partir dessas duas observações, pode-se (IMHO) razoavelmente supor que o MSVC
compilador esteja correto.
EDIT : No entanto, o uso do "elenco de notação funcional" pode realmente sugerir o contrário! O MSVC
compilador não tem nenhum problema ao usar uma conversão no estilo C, por exemplo:
uintptr_t answer = (uintptr_t)(nullptr);
mas (como no seu código), ele reclama disso:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
No entanto, do mesmo Projeto de Norma:
5.2.3 Conversão explícita de tipos (notação funcional)
(1) Um especificador de tipo simples (7.1.6.2) ou especificador de nome de tipo (14.6) seguido por uma lista de expressões entre parênteses constrói um valor do tipo especificado, dada a lista de expressões. Se a lista de expressões for uma expressão única, a expressão de conversão de tipo será equivalente (em definição e se definida em significado) à expressão de conversão correspondente (5.4). ...
A "expressão de conversão correspondente (5.4)" pode se referir a uma conversão no estilo C.