【问题标题】:Operator less than between a non-null raw pointer and nullptr非空原始指针和 nullptr 之间的小于运算符
【发布时间】:2017-07-11 00:48:27
【问题描述】:

操作nullptr < ptrptr < nullptr 是否为非空原始指针ptr != nullptr 定义良好?欢迎引用 C++ 标准。

【问题讨论】:

  • 它们产生未指定的值。

标签: c++ c++11 standards comparison-operators nullptr


【解决方案1】:

这样的比较是合式的,但它的结果是不确定的。

[expr.rel]/3 比较指向对象的指针定义如下:

——如果两个指针指向同一个数组的不同元素,或者指向其子对象,则指向具有较高下标的元素的指针比较大。

——如果一个指针指向数组的一个元素或其子对象,而另一个指针指向数组的最后一个元素之后,则后者的指针比较大。

——如果两个指针指向同一个对象的不同的非静态数据成员,或者这些成员的子对象,递归地,如果两个成员具有相同的访问控制,则指向后面声明的成员的指针比较大(第 11 条) ) 并提供他们的类不是联合。

[expr.rel]/4 如果两个操作数 pq 比较相等 (5.10),p<=qp>=q 都产生 truep<qp>q 两者都产生 false。否则,如果指针p 比较大于指针qp>=qp>qq<=pq<p 都将产生truep<=qp<q、@987654 , 和q>p 都产生false。否则,每个运算符的结果都是未指定的。

空指针不属于 [expr.rel]/3 的三个子句中的任何一个,因此它与非空指针的比较既不大于也不小于。那么这种情况就属于[expr.rel]/4的“否则”子句。

【讨论】:

  • 你完全错过了 p4。
  • @T.C.在我的 C++14 副本的 p4 中没有任何相关内容。 C++17 有什么新东西吗?
  • "否则,每个运算符的结果都是未指定的。"
  • @T.C.啊,我确实错过了。更新答案。
猜你喜欢
  • 2016-11-26
  • 2019-04-11
  • 2021-04-05
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
相关资源
最近更新 更多