两个空指针进行顺序比较是否属于定义行为?
两个空指针进行顺序比较是否属于定义行为?
嘿,咱们直奔主题给你明确结论:两个空指针用<或者<=这类顺序运算符比较的行为,在C++标准里是未定义的。
先掰扯清楚这个场景:你说MFC容器为空时,begin和end都是空指针,这时候如果用户写了类似if (container.begin() < container.end())的代码,结果是完全没保障的——编译器想返回true也行,false也行,甚至搞点别的奇怪操作都不违反标准。
可能你会疑惑,那相等比较(==)不是好好的吗?没错,标准明确规定所有空指针互相比较相等性都是定义好的,结果肯定是true。但顺序比较不一样,空指针本身并不指向任何实际内存位置,自然也就没有所谓的“内存顺序”可言,标准也就没给任何约束。
你提到之前的问题是空指针和非空指针的比较,那情况其实也类似——不管是一个空一个非空,还是两个都空,只要用<、<=这类顺序运算符,行为都是未定义的,绝对不能依赖任何固定结果。
回到你的MFC容器场景,要是想避免用户踩坑,最好在文档里明确说明:空容器的begin和end都是空指针,别用顺序比较,要么用相等性判断检查容器是否为空,要么直接用容器自带的empty()方法(如果有的话)。
备注:内容来源于stack exchange,提问作者Martin Fehrs
相关产品推荐
相关产品推荐

