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?

50
demandé sur BЈовић 2016-09-01 21:05:59

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() .

57
répondu Some programmer dude 2016-09-01 18:12:26

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
40
répondu Khalil Khalaf 2016-09-01 20:43:24

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
9
répondu Arnav Borborah 2016-09-01 18:57:19

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() dans sizeof(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()) dans sizeof((void())) est une expression qui a incomplète de type void (à noter que sizeof 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.

6
répondu skypjack 2016-09-11 20:56:51

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).

1
répondu Cold Fire 2016-09-08 08:54:03

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 :

  1. le type vide comprend un ensemble vide de valeurs; il s'agit d'un type incomplet qui ne peut pas être rempli.
  2. ...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

Standard C99

1
répondu WelsonJR 2016-09-11 10:09:53