59 votes

Quel est le point de const void?

Apparemment, il est possible de déclarer une fonction retournant const void :

 const void foo()
{
}
 

g ++ semble considérer le const important, car le code suivant ne compile pas:

 #include <type_traits>

static_assert(std::is_same<void(), const void()>::value, "const matters");
 

Alors, const void a-t-il une signification pratique?

44voto

Logan Capaldo Points 22145

Pas vraiment. Mais ignorer les qualifications cv ou y faire des erreurs pourrait créer une complexité inutile en termes d'implémentation du compilateur et de code de l'utilisateur final. Considérer des modèles comme

   template<typename T>
  const T ...
 

Il n'y a aucune raison de faire de l'utilisation de void dans ce scénario un cas particulier (plus que ce n'est déjà le cas), cela créerait simplement des maux de tête.

En outre, bien que const void ne soit pas utile, const void* a ses utilisations.

11voto

Sie Raybould Points 121

'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 quitter.

Il y a quelques discussion ci-dessus que " const void*' n'est pas très utile (par exemple. Quelle est l'utilité de const void *? Je peux voir comment void * const peut être, mais pas l'ancien. – Spidey) En fait, 'const void*' est parfois indispensable. Il déclare que la chose 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, il est le pointeur constant de 'const void*" qui est le plus utile des deux formes. Bien sûr, il est aussi "const 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 (eg. memcpy()). Si vous souhaitez passer dire un 'const char*' à une telle fonction, alors vous ne pouvez pas utiliser 'void*' 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 la const 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() est 'const void*" et non pas simplement 'void*'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X