Est sizeof(void()) une expression juridique?
de [5.3.3/1] , j'ai trouvé que:
L'opérateur sizeof ne doit pas être appliquée à une expression qui a la fonction ou de type incomplète
de [3.9/5] j'ai trouvé que:
Incomplètement défini les types d'objet et d'un cv vide sont incomplètes types
de toute façon, pour sizeof
ne évaluer ses opérandes, j'aurais dit que sizeof(void())
était une expression légale (en fait GCC le compile et le résultat est 1).
De l'autre côté, de ici , void
n'est pas mentionné lors de la discussion sizeof
, ni lorsque les types ayant la taille 1 sont mentionnés, ni dans la liste de ceux ayant une mise en œuvre définie taille.
la question est donc: est-ce que sizeof(void())
expression légale?
C'est la garantie d'avoir une taille égale à 1?
Ou est-ce une expression légale qui aboutit à un UB et c'est tout?
6 réponses
void()
est un type de fonction (c'est une fonction qui ne prend aucun argument et ne renvoie rien), donc ce n'est pas un type valide dans sizeof()
.
D'après CppReference.com -size of operator , la documentation litterally states:
sizeof
ne peut pas être utilisé avec types de fonctions , types incomplets, ou glvalues de champ de bits.
et puisque void()
est un type de fonction, alors sizeof(void())
n'est pas une expression légale.
dans leur usage exemple, nous pouvons voir leur erreur commentaire sur cette ligne:
std::cout << "size of function: " << sizeof(void()) << '\n'; // error
aussi, si vous compilez le code, comme l'exemple ci-dessous:
#include <iostream>
int main()
{
std::cout << sizeof(void());
}
Le code compile correctement et produit une valeur de 1, mais si vous regardez la compilation, vous voyez ceci:
principal.cpp: en fonction " int main ()":
principal.rpc:5:29: warning: invalid "sizeof" à un type de fonction [-Wpointer-arith]
std:: cout << sizeof (void ());
donc, il est évident que sizeof()
ne s'applique pas aux types de fonctions, donc le code produit un avertissement. Il n'est pas valide.
Code ici
une petite prémisse.
la question découle d'une interprétation erronée de l'opérateur sizeof
.
En fait, le PO a considéré void()
comme une expression de type incomplet dans le contexte de sizeof
et la question elle - même peut se lire comme - pourquoi sizeof
accepter l'expression void()
, qui est un type incomplet et ne devrait pas être accepté comme mentionné dans le projet de travail ?
C'est pourquoi [3.9/5] est mentionné en fait, sinon cela n'aurait pas eu de sens.
cela dit, le fait est que la question contient en fait deux questions intéressantes:
-
pourquoi
sizeof(void())
n'est-il pas légal?
C'est la question du titre lui-même. -
pourquoi
sizeof((void()))
n'est-il pas légal?
C'est la question que L'on veut se poser dans le cadre de L'OP.
les Réponses ci-dessous:
-
void()
danssizeof(void())
est interprété comme un type de fonction et il est mal formé comme pour [5.3.3/1] (la taille de l'opérateur ne doit pas être appliquée à une expression ayant la fonction ou incomplète type, au nom entre parenthèses de tels types , [...]
-
(void())
danssizeof((void()))
est une expression qui a incomplète de typevoid
(à noter quesizeof
est un non évaluée contexte) et il est mal formé que pour [5.3.3/1] (c'est moi qui souligne):la taille de l'opérateur ne doit pas être appliquée à une expression qui a fonction ou type incomplet , au nom entre parenthèses de tels types, [...]
dans les deux cas, GCC compile le code avec un avertissement.
comme déjà souligné dans les docs ici http://en.cppreference.com/w/cpp/language/sizeof
Notes
sizeof()
ne peut pas être utilisé avec types de fonctions , types incomplets, ou glvalues de champ bit.
étant donné que void()
est un type de fonction, il ne s'agit donc pas d'un type valide de sizeof()
Note:
void()
est une fonction qui ne prend aucun argument et ne renvoie rien
citant un exemple de Docs:
//<< "size of function: " << sizeof(void()) << '\n' // error
ainsi répond à vos questions:
1) Non il ne s'agit pas d'une Expression juridique.
2) il affichera 1, mais affichera un avertissement
3) identique à 1).
Droit de la C99 N ° de référence
indiqué dans le document sous la rubrique 6.5.3.4 la taille de l'opérateur :
la taille de l'opérateur ne doit pas être appliquée à une expression qui a un type de fonction ou un type incomplet, au nom entre parenthèses d'un tel type, ou à une expression qui désigne un membre de champ bit.
selon les articles 19 et 20 de la section 6.2.5 Types :
- le type vide comprend un ensemble vide de valeurs; il s'agit d'un type incomplet qui ne peut pas être rempli.
- ...Un type de fonction décrit une fonction spécifiée type de retour. Un type de fonction est caractérisée par son type de retour et le nombre et les types de ses paramètres. Un type de fonction est dit dérivé de son type de retour, et si son retour type est T, le type de fonction est parfois appelé ‘fonction retournant T’. La construction d'un type de fonction à partir d'un type de retour est appelée ‘fonction de dérivation de type’.
ainsi nul() est un type de fonction dérivé d'un type incomplet et son opérande illégale pour la taille de. Cela dit, ses retours dépendra de l'implémentation du compilateur et n'a aucune valeur de Retour Garantie