web-dev-qa-db-fra.com

Quel est l'intérêt 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");

const void A donc une signification pratique?

59
fredoverflow

Pas vraiment. Mais ignorer cv - qualifications on void ou leur faire des erreurs pourrait créer une complexité inutile en termes d'implémentation du compilateur et de code d'utilisateur final. Envisagez 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 spécial (plus qu'il ne l'est déjà), cela créerait simplement des maux de tête.

De plus, tandis que const void n'est pas utile, const void* a ses utilisations.

44
Logan Capaldo

const void Est autorisé simplement parce qu'il est inutile que le compilateur supprime cette exception à une règle générale et cela ne fait aucun mal de la laisser.

Il y a une discussion ci-dessus que const void* N'est pas très utile:

Quelle est l'utilité de const void *? Je peux voir à quel point void * const pourrait être, mais pas le premier. –Spidey

En fait, const void* Est parfois essentiel. Il déclare que la chose pointée est en lecture seule par opposition à void* const Qui déclare seulement que le pointeur lui-même est constant mais pas la chose vers laquelle il pointe.

D'après mon expérience, le pointeur sur constant utilisant const void* Est le plus utile des deux formes. Bien sûr, il y a aussi const void* const Ce qui signifie que le pointeur et la chose vers laquelle il pointe sont constants.

void* Est normalement utilisé comme moyen de passer des pointeurs non spécifiques (par exemple avec memcpy()). Si vous souhaitez passer un const char* À une telle fonction, vous ne pouvez pas utiliser void* Ou vous perdez le fait que la chose vers laquelle il pointe est constante et ne peut pas être modifiée. Les compilateurs C++ actuels refuseront de compiler cela car ils devraient implicitement convertir le const, et à juste titre, car ces données pourraient être dans la mémoire morte et provoquer éventuellement une exception si quelque chose essayait d'y écrire.

C'est pourquoi le deuxième argument de memcpy() est const void* Et pas simplement void*.

11
Sie Raybould