Les opérations nullptr < ptr
et ptr < nullptr
sont-elles bien définies pour un pointeur brut non nul ptr != nullptr
? Les citations de la norme C++ sont les bienvenues.Opérateur inférieur à celui entre un pointeur brut non nul et nullptr
Répondre
Une telle comparaison est bien formée, mais son résultat n'est pas spécifié.
[expr.rel]/3 La comparaison des pointeurs vers des objets est défini comme suit:
- Si deux pointeurs pointent vers différents éléments d'un même tableau, ou pour des sous-objets de celle-ci, le pointeur vers le élément avec l'indice supérieur compare plus grand. - Si un pointeur pointe sur un élément d'un tableau, ou sur un sous-objet de celui-ci, et qu'un autre pointeur dépasse le dernier élément du tableau, le dernier pointeur est plus grand.
- Si deux pointeurs pointent vers différents membres de données non statiques du même objet, ou vers des sous-objets de ces membres, récursivement, le pointeur vers le membre déclaré plus tard est supérieur à condition que les deux membres aient le même contrôle d'accès. 11) et pourvu que leur classe ne soit pas une union.
[expr.rel]/4 Si deux opérandes
p
etq
comparer égal (5,10), etp<=q
p>=q
la fois le rendement ettrue
p<q
etp>q
fois le rendementfalse
. Dans le cas contraire, si un pointeurp
compare supérieur à un pointeurq
,p>=q
,p>q
,q<=p
etq<p
donnent toustrue
etp<=q
,p<q
,q>=p
etq>p
rendement globalfalse
. Sinon, le résultat de chacun des opérateurs n'est pas spécifié.
Un pointeur nul ne tombe dans aucune des trois clauses de [expr.rel]/3, et il se compare ni plus ni moins d'un pointeur non nul. Ce cas relève alors de la clause "contraire" de [expr.rel]/4.
Vous avez complètement raté p4. –
@ T.C. Il n'y a rien de pertinent dans p4 de ma copie de C++ 14. Y a-t-il quelque chose de nouveau dans C++ 17? –
"Sinon, le résultat de chacun des opérateurs n'est pas spécifié." –
Ils donnent des valeurs non spécifiées. –