2017-02-28 66 views
5
struct X { 
    int f(int); 
    static int f(long); 
}; 

int (X::*p1)(int) = &X::f; // OK 
int (*p2)(int) = &X::f; // error: mismatch 
int (*p3)(long) = &X::f; // OK 
int (X::*p4)(long) = &X::f; // error: mismatch 
int (X::*p5)(int) = &(X::f); // error: wrong syntax for pointer to member 
int (*p6)(long) = &(X::f); // OK 

我认为p1和p5是相同的情况。为什么p5是错的?结构中指向静态成员的指针

回答

2

C++标准的一个指针 - 内置operator &状态,只有当参数&合格-ID,这意味着像Class::Member,确实&结果的定义对成员。圆括号使其不再是限定标识,因此它试图直接解析X::f,在此情况下这是非法的:您将int (*)(long)指定给int (X::*)(int)

这两种情况之间的区别解决了一个模棱两可的问题。比方说,你有:

struct X { 
    int m; 
}; 
struct Y { 
    int m; 
}; 
struct Z : X, Y { 
    void F(); 
}; 

void Z::F() { 
    int X::*p1 = &X::m; 
    int *p2 = &(X::m); 
} 

这里,&X::m是一个指针到成员,而&(X::m)是一个普通的指针int,使用X::资格来解决XmY的之间的模糊性m

5

因为标准是这样说的。从N3936:

5.3.1一元运算符

  • 当使用显式&仅形成一个指向构件和它的操作数是一个合格的-ID不包含在圆括号中。 [注: 即表达式&(qualified-id),其中限定符号为 括在括号内,并不形成“成员指针 ”类型的表达式。不隐含 从非静态成员函数的qualified-id转换为 类型的“指向成员函数的指针”,因为存在从 函数类型的左值到类型“指向函数的指针”(4.3)的类型。 &不合格id是指向成员的指针,即使在非限定id类的 范围内也是如此。 - 注完]