Quel est le point de const void?
Apparemment, il est possible de déclarer une fonction retournant const void
:
const void foo()
{
}
g++, on semble considérer le const
important, parce que le code suivant ne compile pas:
#include <type_traits>
static_assert(std::is_same<void(), const void()>::value, "const matters");
Donc ne const void
ont aucune signification pratique?
- Sans connaître les détails, je dirais qu'il est là pour orthogonalité des raisons. Imaginez une méta-fonction qui prend l'remplace le type, mais pas à la qualification. Il serait de travailler avec tous les types, à l'exception de nullité si le vide peut implicitement être enlevée.
- Je suis maintenant curieux en ce qui a mené à cette découverte. 🙂 En jouant avec votre compilateur intermédiaire de la sortie, en sommes-nous?
- J'étais en train de décider où placer les
const
dans un pointeur de fonction tableau de recherche. Il y avait trois emplacements possibles. L'un d'eux réussi à compiler, et ultrapériphériquesconst
clairement déclaré un tableau de pointeurs de fonctions retournantconst void
, et j'ai été surpris que le compilateur a accepté le code. - cdecl.org est utile pour ces quelques moments de demander "qu'est-ce qualificatif s'applique à?"
Vous devez vous connecter pour publier un commentaire.
Pas vraiment. Mais à ignorer cv-qualifications à vide ou à faire des erreurs pourraient créer la complexité inutile, en termes de mise en œuvre de compilateur et à la fin-le code de l'utilisateur. Envisager des modèles comme
Il n'y a pas de raison de le faire à l'aide de vide dans le scénario d'un cas particulier (plus qu'il ne l'est déjà), il serait tout simplement créer des maux de tête.
Aussi, tandis que
const void
n'est pas utile,const void*
a ses utilise.void*
terre.string read_name(enum dynamic_type, const void*)
. C'est pas super utile, non, mais plus queconst void
. Et bien sûrvoid* const
est utile, mais ce n'est pas vraiment pertinente à la question.T*
) dansvoid*
(et revenir plus tard), puisconst void*
est leconst
équivalent (donc pour certainsconst T*
). Bien sûr, vous pourriezconst_cast
loin, mais pourquoi? En d'autres termes, c'est précisément aussi utile que tout autreconst T*
et c'est "pas mal". 🙂const void
est autorisé simplement parce qu'il n'y a pas de point de prendre le compilateur coup de pied hors de cette seule exception à une règle générale, et il n'y a aucun mal à le laisser dans.Il y a quelques discussion ci-dessus que
const void*
n'est pas très utile:En fait
const void*
est parfois essentielle.Il déclare que la chose qui est souligné est en lecture seule, par opposition à
void* const
qui ne déclare que le pointeur lui-même est constante, mais pas la chose qu'il points de.De mon expérience, le pointeur constant à l'aide de
const void*
est le plus utile des deux formes. Bien sûr, il y a aussiconst void* const
ce qui signifie que le pointeur de la chose et il points de est une constante.void*
est normalement utilisé comme un moyen de transmettre non spécifique des pointeurs autour de (par exemple avecmemcpy()
).Si vous souhaitez passer un
const char*
à une telle fonction, alors vous ne pouvez pas utiliservoid*
ou vous perdez le fait que la chose dont elle est constante et ne peut pas être modifié. Actuel compilateurs C++ refusera de compiler qu'il aurait implicitement une fonte de laconst
loin, et à juste titre que ces données peuvent être en lecture seule de la mémoire et éventuellement provoquer une exception si quelque chose essaie d'écrire.C'est pourquoi le deuxième argument de
memcpy()
estconst void*
et pas simplementvoid*
.