2017-02-28 65 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類的 範圍內也是如此。 - 注完]