C++ 将指针与成员进行比较?

C++ 将指针与成员进行比较?,c++,C++,我对为什么不能使用二进制运算符将指针与成员进行比较感到困惑 class Point3d{ protected: //.. public: float x; static list<Point3d*> *freeList; public: float y; static const int chunkSize = 250; public: float z; g++报告: "invalid operands of

我对为什么不能使用二进制运算符将指针与成员进行比较感到困惑

class Point3d{
  protected:
      //..
 public:
     float x;
      static list<Point3d*> *freeList;
 public:
     float y;
     static const int chunkSize = 250;
 public:
    float z;
g++报告:

"invalid operands of types ‘float Point3d::*’ and ‘float Point3d::*’ to binary ‘operator<’"

“类型为'float Point3d::*'和'float Point3d::*'到二进制'运算符的无效操作数如果Point3d重载,<则遵从它们并进行比较

返回 *mem1<*mem2? “成员1 accurs first”: “成员2 accurs first”

或者更改签名

字符*访问顺序(数据类型1类:&mem1,数据类型2类:&mem2) 字符*访问顺序(数据类型1类\类型::mem1,数据类型2类\类型::mem2)


是否要对实际内存地址进行比较?

原因与一般情况下无法比较指针相同。只有 支持的顺序比较是两个数据指针是否指向 放入同一数组。否则,比较结果为 未指定;编译器不需要使运算符在中“工作” 任何合理的方式。(确保这里的总订单需要额外的费用。) 在某些架构上进行计算。)因为没有任何情况 为指向成员的指针指定结果,标准不允许 将它们作为运算符的参数

如果您需要总订单,
std::less
等保证提供 它包括,如果我正确理解了标准,成员指针。 (尽管提供了指向成员函数的指针的总顺序 可能会非常昂贵。)然而,即使如此,这种订购 可能是任意的;它肯定不需要反映任何
在内存中排序。

指向成员的指针本身并不指向某些内存。它们只是标签。使用它们可以做的唯一一件事是使用运算符
*
->*
将它们转换为对给定对象的指针值的引用,或者存储在指向成员变量的另一个指针中

struct A
{
    int a;
    float b;
};
A a;
int A::* p2m = &A::a;
int A::* p2m2 = p2m;

int & realPointer = a.*p2m;

请注意,您只能比较相同类型的指针,因此无法将指向
A::A
int A::*
)的指针与指向
A::b
float A::*

的指针进行比较。您可以比较对象成员的地址

A a;
if (std::less<void*>()(&a.a, &a.b))
    std::cout << "a precedes b\n";
else
    std::cout << "a follows b\n";
A;
if(std::less()(&a.a和&a.b))

出于同样的原因,您不应该使用operator@FrerichRaabe我不认为这是重复的,因为他问的是指向数据成员的指针,而不是指向成员函数的指针。(此外,你引用的线程中的主要答案是不正确的。)@JamesKanze:对不起,我看错了-我以为另一个问题说了““指向成员的指针”。我同意它不是复制品。我可以在这里回复我的关闭请求吗?当然,我只想测试/检查C++内存模型,非常感谢~~~~
struct A
{
    int a;
    float b;
};
A a;
int A::* p2m = &A::a;
int A::* p2m2 = p2m;

int & realPointer = a.*p2m;
A a;
if (std::less<void*>()(&a.a, &a.b))
    std::cout << "a precedes b\n";
else
    std::cout << "a follows b\n";