web-dev-qa-db-fra.com

Qu'est-ce que const void?

La description de std::is_void déclare que:

Fournit la valeur constante du membre égale à true, si T est le type , vide vide, vide volatile, ou vide volatile constant.

Alors que pourrait être const void ou un volatile void?

Cette réponse indique que const void le type de retour serait invalide (cependant compilé sur VC++ 2015)

const void foo() { }

Si par norme, const void n'est pas valide (le VC est faux) - alors qu'est-ce que const void?

83
Ajay

const void est un type sur lequel vous pouvez former un pointeur. Cela ressemble à un pointeur vide normal, mais les conversions fonctionnent différemment. Par exemple, un const int* ne peut pas être converti implicitement en un void*, mais il peut être implicitement converti en un const void*. De même, si vous avez un const void* vous ne pouvez pas static_cast à un int*, mais tu peux static_cast à un const int*.

const int i = 10;
void* vp = &i;                           // error
const void* cvp = &i;                    // ok
auto ip = static_cast<int*>(cvp);        // error
auto cip = static_cast<const int*>(cvp); // ok
86
Benjamin Lindley

Comme void, const void est un type vide. Toutefois, si const void est un type return , le const n'a pas de sens (bien que légal!), car [expr]/6 :

Si une prvalue a initialement le type “ cv T”, où T est un non-classe cv non qualifié , type non-array, le type de l'expression est ajusté à T avant toute analyse ultérieure.

Cependant, il s’agit d’un type valide en tant que tel et se produit par ex. fonctions de la bibliothèque C-standard , où il est utilisé pour assurer la const-exactitude des pointeurs d'arguments: int const* ne peut pas être converti en void*, mais void const*.

21
Columbo

Les types peuvent être le résultat de modèles; un modèle pourrait indiquer const T et instancié avec T comme void.

La réponse liée est induite en erreur, ou plutôt limitée, dans la mesure où elle concerne le cas particulier d’un type non-template, et même dans ce cas const void pourrait être sans signification, mais c'est code valide.

18
DevSolar