我知道指针的关系运算符仅在有限的情况下提供可靠的结果,并且不能保证它们会生成总顺序。但是,这些运算符的标准函数对象确实具有生成总顺序的特化。
那么是什么阻止了同样的规则适用于内置运算符呢?这似乎并没有简化任何事情,因为这些函数对象仍然需要可靠的比较(通过一些特定于实现的方法)才能工作。
此外,是否可以仅使用内置运算符对指针进行可靠比较?虽然看起来不可能,但我想在这里确认一下。
我知道指针的关系运算符仅在有限的情况下提供可靠的结果,并且不能保证它们会生成总顺序。但是,这些运算符的标准函数对象确实具有生成总顺序的特化。
那么是什么阻止了同样的规则适用于内置运算符呢?这似乎并没有简化任何事情,因为这些函数对象仍然需要可靠的比较(通过一些特定于实现的方法)才能工作。
此外,是否可以仅使用内置运算符对指针进行可靠比较?虽然看起来不可能,但我想在这里确认一下。
并不是他们不生成一个总订单,而只是他们不能保证这样做。在实践中,它们通常会服从大多数现代硬件的总排序。只是标准不能保证。
当然,一个实现总是可以强迫他们这样做,但它归结为 C++ 指导原则,“你不用为你不使用的东西付费”。在某些 CPU 上,这样做可能会更昂贵。
假设您的 CPU 具有更复杂的地址模型,例如分段地址空间。在这种情况下,确定一个指针是否“大于”另一个指针就不再那么简单了。所以 C++ 标准允许两者:“通常的”弱指针比较规则只保证某些有限情况下的总排序(基本上,当指针指向同一个数组时,它保证是线性和顺序的,并且可以非常有效地实现),以及诸如std::less
在某些 CPU 上可能更昂贵的包装函数,但它们确实保证了所有指针的总排序。