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
?
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
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*
.
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.