【发布时间】:2017-07-11 00:48:27
【问题描述】:
操作nullptr < ptr 和ptr < nullptr 是否为非空原始指针ptr != nullptr 定义良好?欢迎引用 C++ 标准。
【问题讨论】:
-
它们产生未指定的值。
标签: c++ c++11 standards comparison-operators nullptr
操作nullptr < ptr 和ptr < nullptr 是否为非空原始指针ptr != nullptr 定义良好?欢迎引用 C++ 标准。
【问题讨论】:
标签: c++ c++11 standards comparison-operators nullptr
这样的比较是合式的,但它的结果是不确定的。
[expr.rel]/3 比较指向对象的指针定义如下:
——如果两个指针指向同一个数组的不同元素,或者指向其子对象,则指向具有较高下标的元素的指针比较大。
——如果一个指针指向数组的一个元素或其子对象,而另一个指针指向数组的最后一个元素之后,则后者的指针比较大。
——如果两个指针指向同一个对象的不同的非静态数据成员,或者这些成员的子对象,递归地,如果两个成员具有相同的访问控制,则指向后面声明的成员的指针比较大(第 11 条) ) 并提供他们的类不是联合。
[expr.rel]/4 如果两个操作数
p和q比较相等 (5.10),p<=q和p>=q都产生true和p<q和p>q两者都产生false。否则,如果指针p比较大于指针q、p>=q、p>q、q<=p和q<p都将产生true和p<=q、p<q、@987654 , 和q>p都产生false。否则,每个运算符的结果都是未指定的。
空指针不属于 [expr.rel]/3 的三个子句中的任何一个,因此它与非空指针的比较既不大于也不小于。那么这种情况就属于[expr.rel]/4的“否则”子句。
【讨论】: