2016-08-16 2 views
0

J'ai lu attentivement sur les règles pour le type aliasing: http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing j'ai spécifiquement une question sur la dernière règle, dans laquelle nous sommes autorisés à jeter à:Comment void fonctionne avec le type Aliassing?

char ou unsigned char: cela permet l'examen de l'objet la représentation d'un objet comme un tableau de unsigned char

J'ai remarqué que cela ne pas comprennent le type void. Ne devrions-nous pas être en mesure de jeter quelque chose à void et de retour aussi?

+0

Vous pouvez lancer la fonction "void *" et revenir en arrière. – NathanOliver

+1

La diffusion d'un pointeur vers un type non apparenté n'est pas interdite. Déréférencer le résultat et utiliser la valeur est. –

+0

Je m'excuse si ma réponse semble condescendante. Vous avez clairement plus de connaissances sur le C++ que moi, mais je veux m'assurer que la réponse est comprise par tous ceux qui la lisent, donc j'ai un peu baissé les choses. –

Répondre

2

Il n'y a aucun alias de type dans ce cas, car vous ne pouvez pas examiner un objet via un void*. Pour ce faire, vous devez déréférencer le void*, mais cela n'est pas autorisé. void dans n'importe quel contexte est un type incomplet et vous ne pouvez pas déréférencer des pointeurs vers des types incomplets.

2

void est un type incomplet. Il ne peut jamais y avoir d'objet de type void.

+2

Ce n'est pas seulement incomplet, mais il ne peut jamais être complété. C'est différent, disons, 'int []', qui peut certainement être le type d'un glvalue (mais pas un prvalue). –

0

voidvoid est étrange en ce que vous pouvez déclarer quelque chose void*, mais vous utiliseriez rarement void en dehors du contexte d'une définition de fonction. En ce sens, c'est un type incomplet, et n'a donc pas de signification réelle en soi. void existe vraiment juste pour la syntaxe.

Vous pouvez techniquement jeter un type à void,

int i = 0; 
(void)i; 

mais cela est vraiment un no-op. Vous pourriez voir ceci quand quelqu'un essaye de cacher des avertissements de compilateur au sujet des variables inutilisées. Vous ne pouvez pas renvoyer le résultat à son type d'origine, car il ne génère pas de résultat.

Vous pouvez également convertir et déclarer des pointeurs en tant que void*, ce qui signifie qu'il peut pointer sur n'importe quoi (avec quelques exceptions). Cependant, vous ne pouvez pas le déréférencer tant que vous ne l'avez pas converti en type complet, par exemple unsigned char.