L'utilisation d'un hyperlinked C++ grammar, l'analyse syntaxique de decltype(void())
est:
decltype(expression)
decltype(assignment-expression)
decltype(conditional-expression)
... beaucoup d'étapes impliquant l'ordre des opérations vont ici ...
decltype(postfix-expression)
decltype(simple-type-specifier (expression-listopt))
decltype(void())
Alors void()
est une sorte de expression
ici, en particulier un postfix-expression
.
Plus précisément, l'article citant 5.2.3 [expr.type.conf] le paragraphe 2 de la norme de l'ISO 2011 C:
L'expression T()
, où T
est un simple spécificateur-type ou spécificateur de nom de type pour un type d'objet complet non-tableau ou le type (éventuellement qualifié cv) void
, crée une prvalue du type spécifié , qui est initialisé en valeur (8,5, aucune initialisation n'est effectuée pour le cas void()
).
Alors void()
est une expression de type void
, tout comme int()
est une expression de type int
(avec une valeur 0
). Il est clair qu'une expression vide n'a aucune valeur, mais ici c'est l'opérande de decltype
, donc elle n'est pas évaluée. decltype
se réfère uniquement à son type d'opérande, pas à sa valeur.
decltype(void())
est simplement une manière verbeuse de faire référence au type void
.
@skypjack: Voir la norme C++ 11 (ou un brouillon), section 5.2.3 [expr.type.conv], paragraphe 2. Un * simple-type-specifier * suivi de parenthèses vides "crée une prvalue du type spécifié, qui est valueinitialized (8.5, aucune initialisation n'est effectuée pour le cas void()) ". Tout comme 'int()' est une expression de type 'int',' void() 'est une expression de type' void'. Et puisque c'est l'opérande de 'decltype', ce n'est pas évalué. 'decltype (void())' est simplement une façon complexe de faire référence au type 'void'. (Yakk, vous pourriez étendre votre réponse pour expliquer comment 'void()' est une expression.) –
@Yakk Comme déjà mentionné dans les commentaires, l'expansion de la réponse avec plus de détails aiderait. +1 pour promouvoir la suggestion. Je vous remercie. – skypjack
Je me suis permis d'ajouter une explication de ce que signifie 'void()'. S'il vous plaît vérifier ma mise à jour pour l'exactitude. –