Maison >développement back-end >C++ >Le comportement « i = i ; » est-il non défini même avec les types définis par l'utilisateur ?

Le comportement « i = i ; » est-il non défini même avec les types définis par l'utilisateur ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-28 11:52:25766parcourir

Is `i  =   i;` Undefined Behavior Even with User-Defined Types?

Comportement et points de séquence non définis : une plongée plus profonde

L'expression i = i ; a été étiqueté comme invoquant un comportement non défini (UB), mais que se passe-t-il si le type de i est défini par l'utilisateur, comme dans la classe Index fournie ?

Types définis par l'utilisateur et UB

Dans le cas de types définis par l'utilisateur comme Index, l'expression i = i; est toujours considéré comme UB. En effet, le type défini par l'utilisateur ne remplace pas le comportement par défaut des opérateurs d'incrémentation. Les fonctions Operator () et Operator =() modifient uniquement l'état interne de l'objet Index et ne créent aucun point de séquence. Par conséquent, l'expression modifie l'objet deux fois entre des points de séquence consécutifs, ce qui donne UB.

Équivalence des expressions

Les expressions i.operator =(i.operator () ); et je.add(i.inc()); ne sont pas équivalents à l'original i = i;. Dans la première expression, le point de séquence après l'évaluation de i.operator() permet la modification de l'objet Index avant l'évaluation de l'opérateur =. De même, dans la deuxième expression, les fonctions membres add et inc ne modifient pas l'objet entre des points de séquence consécutifs. Par conséquent, ces expressions n'invoquent pas UB.

Définition de l'expression et points de séquence

L'expression i = i; est bien une expression, mais son comportement n'est pas bien défini. Le nombre de points de séquence associés à une expression ne dépend pas du type d'opérandes impliqués.

Array Subscripting (a[ i] = i)

L'expression a [ je] = je; est également UB dans les deux cas lorsque a est un tableau d'un type intégré ou lorsqu'a est un type défini par l'utilisateur qui surcharge l'opérateur d'indice. Dans les deux cas, l'expression [ i] est évaluée en premier, ce qui incrémente i et renvoie sa valeur pré-incrémentée. Cette valeur est ensuite utilisée comme index dans le tableau, ce qui peut entraîner UB si l'index est hors limites.

Opérations d'incrémentation multiples (i)

La expression je; est bien défini en C 03 et a le même comportement que l'expression ((((i.operator ()).operator ()).operator ()).operator ()).operator ());. Chaque invocation d'opérateur () renvoie une référence à l'objet Index, et les points de séquence après chaque évaluation de fonction garantissent que l'objet n'est modifié qu'une seule fois entre des points de séquence consécutifs.

Conclusion

En résumé, les expressions i = i; et une[ je] = je; invoquez UB pour les types définis par l'utilisateur, même si les types fournissent des opérateurs surchargés. Les opérations d'incrémentation multiples sur les objets Index sont bien définies, démontrant que les points de séquence et le nombre de modifications apportées à un objet entre les points de séquence sont indépendants du type d'opérandes impliqués.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:CS - Semaine 5Article suivant:CS - Semaine 5