std::less<Pointer> 的严格总顺序

strict total order of std::less<Pointer>

本题来自:

If you have say two vectors a and b, the total order is permitted to be &a[0], &b[0], &a[1], &b[1], &a[2], &b[2], ..., i.e., with the elements interleaved.

允许这样的顺序吗?

我对标准了解不多。如果我只阅读与 std::less.

直接相关的部分,那似乎是正确的

而且我发现Herb Sutter的gcpp库也有类似的用法(link):

    //  Return whether p points into this page's storage and is allocated.
    //
    inline
    bool gpage::contains(gsl::not_null<const byte*> p) const noexcept {
        //  Use std::less<> to compare (possibly unrelated) pointers portably
        auto const cmp = std::less<>{};
        auto const ext = extent();
        return !cmp(p, ext.data()) && cmp(p, ext.data() + ext.size());
    }

是的,不同的数组(不属于同一个完整对象的一部分)可以在排序中交错,但每个数组必须单独正确排序——这就是它表示全序必须与内置算子建立的偏序一致。 a+1 指向紧跟在 *a 之后的元素这一事实与不相关数组的问题无关,因为偏序正是索引和指针顺序之间的明显关系属于 one 完整的对象。 (事实上​​ ,“紧接着”在这里是循环的,因为唯一可观察到的即时性在数组索引本身中。整数转换不需要遵守它,所以你看不到“真实地址”。)