std::less<Pointer> 的严格全序

Vai*_*Man 7 c++ comparison pointers language-lawyer

这个问题来自这个评论

如果有两个向量 a 和 b,则总顺序允许为 &a[0], &b[0], &a[1], &b[1], &a[2], &b[2], ... ,即元素交错。

该命令是否被允许?

我对标准了解不多。如果我只阅读与 直接相关的部分,这似乎是正确的std::less

我发现 Herb Sutter 的 gcpp 库有类似的用法(链接):

    //  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());
    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*ing 1

是的,不同的数组(不属于同一个完整对象的一部分)可以在排序中交错,但每个数组必须单独正确排序\xe2\x80\x94这就是说总顺序必须与部分顺序一致由内置运算符建立的顺序。a+1指向紧随其后的元素这一事实*a与不相关数组的问题无关,因为偏序正是索引和指针顺序之间的明显关系属于一个数组完整对象。(事实上​​,紧随 \xe2\x80\x9d 之后的 \xe2\x80\x9c 在这里是循环的,因为唯一可观察的直接性是在数组索引本身中。整数转换不需要尊重它,所以你可以 \xe2\x80\x99t 看到\xe2\x80\x9c真实地址\xe2\x80\x9d。)

\n