Quel est le sharepoint const void?

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

 const void foo() { } 

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

 #include  static_assert(std::is_same::value, "const matters"); 

Est-ce que const void a une signification pratique?

    Pas vraiment. Mais ignorer les qualifications de cv sur void ou les rendre erronées pourrait créer une complexité inutile en termes d’implémentation du compilateur et de code d’utilisateur final. Considérer des modèles comme

      template const T ... 

    Il n’y a aucune raison de faire de l’utilisation du vide dans ce scénario un cas particulier (plus qu’il ne l’est déjà), cela ne ferait que créer des maux de tête.

    De plus, bien que const void ne soit pas utile, const void* a ses utilisations.

    const void est autorisé simplement parce que le compilateur ne doit pas exclure cette exception à une règle générale et ne le laisse pas tomber.

    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 un vide peut être, mais pas le premier. –Spidey

    En fait, const void* est parfois indispensable. 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 constante 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 sur laquelle il pointe sont constants.

    void* est normalement utilisé comme un moyen de faire passer des pointeurs non spécifiques (par exemple, avec memcpy() ). Si vous voulez passer un caractère const char* à une telle fonction, vous ne pouvez pas utiliser void* ou vous perdez le fait que la chose sur laquelle il pointe est constante et ne peut pas être modifiée. Les compilateurs C ++ actuels refuseront de comstackr cela car ils devront implicitement convertir le const , et à juste titre, car ces données peuvent être en mémoire morte et provoquer éventuellement une exception si quelque chose essaie d’y écrire.

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