Qu'est-ce que le "comme-si" la règle?
Le "comme-si" règle fondamentalement définit quelles transformations d'une œuvre est autorisée à effectuer sur un juridique un programme C++. En bref, toutes les transformations qui affectent pas un programme "et les comportements observables" (voir ci-dessous pour une définition précise) sont autorisés.
L'objectif est de donner les implémentations de la liberté de procéder à des optimisations tant que le comportement du programme demeure conforme à la sémantique spécifiée par la Norme C++ en termes d'une machine abstraite.
D'où vient le Standard introduire cette règle?
Le C++11 introduit le "comme-si" règle du Paragraphe 1.9/1:
La sémantique des descriptions dans la présente Norme Internationale définir un paramétrée de façon non déterministe abstrait
de la machine. La présente Norme Internationale n'impose aucune exigence sur la structure de la conformité des mises en œuvre.
En particulier, ils n'ont pas besoin de copier ou de reproduire la structure de la machine abstraite. Plutôt, conforme
les implémentations sont nécessaires pour émuler (seulement) les comportements observables de la machine abstraite, comme expliqué
ci-dessous.
Aussi, une note explicative ajoute:
Cette disposition est parfois appelé le "comme-si" la règle, parce que l'application est libre de faire abstraction de toute exigence de la présente
La Norme internationale, tant que le résultat est comme si l'obligation avait été obéi, autant que cela peut être déterminée à partir de la
les comportements observables du programme. Par exemple, une mise en œuvre effective n'a pas besoin d'évaluer une partie d'une expression si elle peut
en déduire que sa valeur n'est pas utilisée et qu'aucun des effets secondaires affectant les comportements observables du programme sont produites.
Quelle est la règle de mandat exactement?
Le paragraphe 1.9/5 précise en outre:
Conforme de la mise en œuvre de l'exécution d'un bien formé programme doit produire les mêmes comportements observables
comme l'un des exécutions de l'instance correspondante de la machine abstraite avec le même programme
et de la même entrée. Cependant, si une telle exécution contient un indéfini, cet International
La norme n'impose aucune exigence sur la mise en œuvre de l'exécution de ce programme avec celui d'entrée (même pas
concernant les opérations précédant le premier pas défini de l'opération).
Il est important de souligner que cette contrainte s'applique lors de l' exécution d'un bien formé programme" , et que les résultats possibles de l'exécution d'un programme qui contient un comportement indéfini sont sans contrainte. Ceci est explicité dans le Paragraphe 1.9/4 ainsi:
Certaines autres opérations sont décrites dans la présente Norme Internationale comme non défini (par exemple, l'effet
de la tentative de modifier une const objet). [ Note: la Présente Norme Internationale n'impose pas d'exigences sur
le comportement des programmes qui contiennent un comportement indéfini. -la note de fin ]
Enfin, concernant la définition de "comportements observables", Paragraphe 1.9/8 va comme suit:
Au moins les exigences de la conformité de la mise en œuvre sont:
- L'accès à la volatilité des objets sont évalués strictement selon les règles de la machine abstraite.
- À la fin du programme, toutes les données écrites dans des fichiers doit être identique à l'un des résultats possibles qui
l'exécution du programme en fonction de la sémantique abstraite aurait produit.
- L'entrée et la sortie de la dynamique de dispositifs interactifs prennent place dans une telle manière que les invites
la sortie est en fait livré avant un programme attend d'entrée. Ce qui constitue un dispositif interactif
la mise en œuvre est définie.
Ces sont collectivement dénommés les comportements observables du programme. [ Note: Plus strictes
les correspondances entre l'abstrait et le réel de la sémantique peut être défini par chaque application. -fin
note ]
Existe-il des situations où cette règle ne s'applique pas?
Au meilleur de ma connaissance, la seule exception pour le "comme-si" la règle est de copier/déplacer des élision, ce qui est admis, même si le constructeur de copie, déplacer le constructeur ou le destructeur d'une classe ont des effets secondaires. Les conditions exactes de ce sont spécifiées dans le Paragraphe 12.8/31:
Lorsque certains critères sont respectés, une mise en œuvre est permis d'omettre de le copier/déplacer construction d'une classe
objet, même si le constructeur sélectionné pour la copie/déplacement de l'opération et/ou le destructeur de l'objet
avoir des effets secondaires. [...]