Bien que je ne puisse trouver aucune mention explicite dans ce Working Draft C ++ Standard (de 2014) que la conversion de std::nullptr_t
vers un type intégral est interdite, il n'y a pas non plus mention qu'une telle conversion est autorisée!
Cependant, le cas de la conversion de std::nullptr_t
vers bool
est explicitement mentionné:
4.12 Conversions booléennes
Une valeur de type arithmétique, énumération non étendue, pointeur ou pointeur vers le type de membre peut être convertie en une valeur de type bool. Une valeur nulle, une valeur de pointeur nulle ou une valeur de pointeur de membre nul est convertie en faux; toute autre valeur est convertie en true. Pour l'initialisation directe (8.5), une valeur de type std :: nullptr_t peut être convertie en une valeur de type bool; la valeur résultante est fausse.
De plus, le seul endroit dans ce projet de document où la conversion de std::nullptr_t
à un type intégral est mentionné, est dans la section "reinterpret_cast":
5.2.10 Reinterpret cast
...
(4) Un pointeur peut être explicitement converti en n'importe quel type entier suffisamment grand pour le contenir. La fonction de mappage est définie par l'implémentation. [Remarque: Il est destiné à ne pas surprendre ceux qui connaissent la structure d'adressage de la machine sous-jacente. - note de fin] Une valeur de type std :: nullptr_t peut être convertie en type intégral; la conversion a la même signification et la même validité qu'une conversion de (void *) 0 en type intégral. [Remarque: Un reinterpret_cast ne peut pas être utilisé pour convertir une valeur de n'importe quel type en type std :: nullptr_t. - note de fin]
Ainsi, à partir de ces deux observations, on pourrait (à mon humble avis) raisonnablement supposer que le MSVC
compilateur est correct.
EDIT : Cependant, votre utilisation de la «fonte de notation fonctionnelle» peut en fait suggérer le contraire! Le MSVC
compilateur n'a aucun problème à utiliser un cast de style C, par exemple:
uintptr_t answer = (uintptr_t)(nullptr);
mais (comme dans votre code), il s'en plaint:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
Pourtant, à partir du même projet de norme:
5.2.3 Conversion de type explicite (notation fonctionnelle)
(1) Un spécificateur de type simple (7.1.6.2) ou un spécificateur de nom de type (14.6) suivi d'une liste d'expressions entre parenthèses construit une valeur du type spécifié en fonction de la liste d'expressions. Si la liste d'expressions est une expression unique, l'expression de conversion de type est équivalente (dans sa définition et si elle est définie dans sa signification) à l'expression de transtypage correspondante (5.4). ...
L '"expression de conversion correspondante (5.4)" peut faire référence à une conversion de style C.