J'ai vu qu'il était possible de le faire mais je ne comprends pas l'intérêt.Quel est le but de la const_cast <> sur un volatile?
Répondre
est ici un Dr. Dobbs article par Andrei Alexandrescu qui va dans des quantités plutôt obscènes de détails à ce sujet.
C'est un article extrêmement intéressant. Upvoted. – Puppy
Comme beaucoup d'autres choses qu'Alexandrescu a écrit, cet article est éclairant. J'ai posé une question à propos de cet article et de l'abus du qualificatif "volatile" qu'il propose il y a quelque temps http://stackoverflow.com/questions/2491495/may-volatile-be-in-user-defined-types-to- help-writing-thread-safe-code –
En effet, un super article. Merci d'avoir partagé. +1 – jweyrich
const
et volatile
sonnent comme ils se réfèrent à la même idée sur une variable, mais ils ne le font pas. Une variable const
ne peut pas être modifiée par le code actuel. Une variable volatile
peut être modifiée par une entité extérieure en dehors du code actuel. Il est possible d'avoir une variable const volatile
- en particulier quelque chose comme un registre mappé en mémoire - qui est modifiée par l'ordinateur à un moment que votre programme ne peut pas prédire, mais que votre code n'est pas autorisé à changer directement. Vous pouvez utiliser const_cast
pour ajouter ou supprimer const
ou volatile
("cv-qualification") à une variable.
const
et volatile
sont orthogonales.
const
signifie que les données sont en lecture seule.
volatile
signifie que la variable peut être modifiée pour des raisons externes, de sorte que le compilateur doit lire la variable de la mémoire chaque fois qu'elle est référencée.
Ainsi, la suppression de const
vous permet d'écrire ce qui était autrement un emplacement en lecture seule (le code doit avoir une connaissance spéciale de l'emplacement réellement modifiable). Vous ne devez pas supprimer volatile
d'écrire parce que vous pourriez causer un comportement non défini (en raison de 7.1.5.1/7 - If an attempt is made to refer to an object defined with a volatile-qualified type through the use of an lvalue with a non-volatile-qualified type, the program behaviour is undefined.
)
'const_cast' s'applique à la fois à' const' et 'volatile', et même si la suppression potentielle de' volatile' peut entraîner un comportement indéfini , il y a des cas où ce n'est pas le cas. C'est à dire. l'ajout de barrières de mémoire force le compilateur à ne pas mettre en cache la variable et fournit une garantie plus forte que «volatile» (non seulement la variable ne sera pas mise en cache, mais elle ne sera pas réordonnée en dehors de la section critique). –
Est-ce que vous posez des questions sur la conversion d'un const volatile en un volatile ou quelque chose d'autre? –
Comme toujours, l'envoi de code aiderait. –
Balise C supprimée car le langage C n'a pas 'const_cast <>' –