en C ++ Il est possible de allouer un objet Const sur le tas : Donc, cette tentative d'écrire dans un objet sera UB. P> Je n'obtiens pas comment un tel objet sera différent d'un objet alloué en tas non déclaré je veux dire quand j'alloque un objet sur la pile, il va à stockage automatique em> qui est spécifique à la mise en œuvre et donc il pourrait y avoir une implémentation des moyens spécifiques permettant d'allouer des objets Pourtant, chaque fois que j'utilise Comment est un objet const code> : p>
const code> de manière spéciale qui céderait UB lorsque j'écris à un objet. p>
neuf code> compilateur est requis pour émettre
opérateur nouveau () code> Invocation de la fonction et cette fonction ne peut rien faire différent - il alloue simplement la mémoire de manière uniforme, qu'il y ait eu
const code> dans mon code. p>
const code> alloué de tas différent d'un non-
const Code> Un et comment le comportement indéfini est-il possible si j'essaie de le modifier? p> p>
5 Réponses :
C'est différent parce que l'objet créé a un type différent ( C'est la version courte. Il n'y a pas besoin d'être une raison. (Si quelque chose, l'inverse est vrai. Il n'y a pas besoin d'être une raison pour quelque chose d'UB. UB est l'état par défaut. C'est seulement quand il y a une raison pour laquelle quelque chose devient bien défini) P>
Quant à ce que cela signifie dans la pratique em> ou s'il peut réellement causer des problèmes si vous traitez l'objet comme non constitué, le matériel est peu susceptible de faire quelque chose de différent. L'objet Const ne sera évidemment pas écrit dans une sorte de mémoire en lecture seule (car ce n'est pas possible), et la page de mémoire que c'est probablement ne sera probablement pas marquée comme lecture seule une fois que l'objet a été attribué. < / p>
mais le compilateur est autorisé à supposer em> que l'objet est constitué. Il peut donc optimiser ou transformer le code d'une manière légale si l'objet est garanti d'inchangage, mais qui se casse si l'objet est modifié à mi-chemin. P>
Il ne s'agit vraiment pas de la manière dont l'objet est stocké dans le matériel. Const ou aucun const fait rarement une différence sur le niveau matériel. Mais cela fait une différence dans le système de type et fait la différence dans la manière dont le compilateur est capable de transformer le code. P>
Si vous dites au compilateur qu'un objet est constitué, le compilateur vous croit et génère un code sur l'hypothèse que l'objet est constitué. P> Const Classe CODE> au lieu de
Classe code>), et c'est un comportement indéfini car la norme le dit. P >
+1, mais je pense que cela va bien au-delà de "supposer". Un const pointeur i> signifie que vous promettez de ne pas la modifier (via ce pointeur), il est donc probablement constant, vu à travers ce pointeur. Un objet Const i>, d'autre part, est juste cela, constant. Vous avez dit, explicitement. Ce qui signifie que ne peut pas i> jamais changer, (à moins que le programmeur ne soit délibérément stupide). Ce qui signifie que le compilateur peut ne pas seulement assommuer, mais doit savoir et doit considérer que par exemple. Appeler le même membre à plusieurs reprises sera toujours le résultat indicatif exact avec des effets secondaires identiques (sinon l'objet n'est pas i> const).
... ce qui soulève un autre problème intéressant. Vous pouvez créer un objet const à partir d'un type qui n'est pas très Const (par exemple, quelque chose qui modifie l'état global de l'intérieur d'une fonction membre). Il est toujours légal de créer un objet constant de ce type, cependant :(
Le compilateur ne I> a-t-il i> à considérer que l'appelant la même fonction membre renvoie les mêmes résultats (et cela n'est pas garanti pour être vrai pour un objet Const).
@Damon: Jalf est correct; une méthode qui renvoie toujours les mêmes résultats lorsque cela est appelé avec les mêmes arguments s'appelle une méthode "pure"; Il n'y a aucune obligation que chaque méthode sur un objet de const soit pure! Imaginez par exemple un objet Const avec une méthode qui renvoie l'heure actuelle. Rien dans l'objet n'est muté, mais la méthode peut toujours retourner des résultats arbitrairement différents.
@Damon " Un pointeur Const signifie que vous promettez de ne pas modifier i>" non, ça ne le fait pas.
@DAMON " Très pas Const (par exemple, quelque chose qui modifie l'état global de l'intérieur d'une fonction membre). I>" Comment est-ce "Beaucoup non Const"?
@ERIC LIPPERT: Votre exemple d'un objet Const ayant une méthode qui retourne la durée est syntaxiquement correct, mais techniquement incorrect. Comme je l'ai dit dans mon commentaire ci-dessus, il est judicieusement possible de créer un objet qui est constitué et n'est pas (parce que ses membres ne sont pas). Notez également que une fonction pure i> est autorisée à accéder à l'état mondial, dans la mesure où une fonction de retour est vraiment pure, ce n'est tout simplement pas constitué - cela ne permettrait pas d'accéder à un État global tel qu'un minuteur. Maintenant, comment un objet qui a un comportement non constitué serait-il qualifié de const? Pourtant, il est possible de faire une telle chose.
@DAMON: Dans un objet Const, toutes les variables de membres sont implicitement constituées et les fonctions des membres non-consons ne peuvent pas être appelées. Et cela n'a aucun sens de dire qu'un objet "est Const et n'est pas". const code> est un mot clé avec une signification précise en C ++. Il ne signifie pas simplement "constante" (je peux créer un objet qui ne change jamais, et est donc constant, même s'il n'utilise pas le mot clé
const code> même une fois. D'autre part, je peux créer un objet
const code> qui peut toujours être modifié). Au-delà, je ne suis pas vraiment sûr de ce que vous essayez de dire.
Mais la définition d'une fonction pure est généralement que pas i> n'accède à n'importe quel état mutable. Une fonction est pure si sa sortie est déterminée uniquement à partir de ses intrants. Donc, une fonction pure ne peut certainement pas accéder à une minuterie globale.
@DAMON: Nous différerons légèrement sur les détails de ce qui fait une méthode "pure" n'est pas particulièrement pertinente. (Une méthode qui retourne l'heure n'est pas pure.) Mon point est que je suis d'accord avec Jalf: "Const" a une signification particulière en C ++ et il est important de la raisonner correctement. Maintenant, si votre point est que "Cons" n'applique pas réellement le comportement en C ++ que vous aimeriez avoir appliqué, Je suis tout à fait d'accord avec vous i>. Je considère "const" d'être mal cassé en C ++; Cela ne me donne aucune garantie que je peux réellement utiliser pour avantage.
avec compilateurs actuels, il n'y a pas de différence technique. Comportement indéfini inclut des choses qui travaillent miraculeusement. P>
Je me rappelle faiblement qu'il existait une proposition de disposer de constructeurs qualifiés constants qui permettraient des instances de casage spéciales où l'objet serait const code> immédiatement après la construction; ce serait utile par ex. Pour les classes de chaîne qui alloueraient moins de mémoire si elles n'avaient pas besoin d'attendre la chaîne de croissance. P>
Il n'y a pas de différence dans l'objet em>. Il y a une différence dans le type (heure de compilation) de la ou des variable (s) utilisée (s) pour référence em> dans la zone de mémoire. P>
Ceci est un frottement sémantique uniquement: la variable est différente, la mémoire réelle utilisée par les bits de données est Const / volatile agnostique. P>
Pour une histoire très «forte> Amusante et éclairante forte> décrivant des frictions sémantiques similaires Voir cette réponse préférée par Eric Lippert: P>
Traitement des données de Const de manière non constituée peut entraîner un comportement non défini, car le compilateur est autorisé à effectuer certaines optimisations basées sur les connaissances em> qu'une variable de const ne changera pas 1 sup>. Changement de cela non-moins (par exemple par 1 sup> Notez que
sur le comportement non défini h3>
const_cast <> code>) peut conduire à des résultats orthographiques car les hypothèses du compilateur sont activement annulées. P>
volatile code> em> est là pour aider dans les cas où les variables constantes peuvent être modifiées simultanément. Vous pouvez voir comment
const code> est un «local» ne pas / ne peut pas toucher em> Promis, tandis que
volatile code> dit: 'Don 't suppose que cela ne changera pas, même s'il n'est pas écrit dans ce segment de code' em>.
` p>
Ajout d'une justification pour la revendication UB
C'est dépendant de la mise en œuvre, mais ce n'est probablement pas différent. Il pourrait em> être modifié. Mais le compilateur rejette le code qui tente. P>
const code> est davantage de refuser de compiler le code qui modifie l'objet que de la réalisation d'une modification impossible de modifier par aucun moyen. C'est une note au compilateur qui dit "Ne me laissez pas essayer de changer cela par erreur." P>
" C'est une note au compilateur i>" déclarant qu'un objet Const est également Promise B> au compilateur.
Il n'y a pas de différence que ce soit entre le const et l'objet non-Const. Il n'y a pas de comportement non défini ni dans votre exemple. Qu'est-ce que vous attendez-vous? En appelant la fonction de non-Const, vous obtiendrez le comportement que vous attendez d'y après.
Permettez-moi de vous rappeler que certains champs peuvent être déclarés mutables em> afin que l'objet ne soit pas constitué comme tout . Sans mentionner que vous pouvez même abuser de Syuch à une manière que le compilateur ne soit pas au courant de la non-Constitution concrète de votre fonction membre: p> là-bas, nous pouvons peut-être obtenir ub. < / p> p>
Veuillez fournir une citation standard.
" Cela céderait ub i>" Je ne pense pas que vous comprenez ce que "UB" signifie.