2017-02-16 66 views
0
struct test 
{ 
    void f() {}; 
}; 
test t1; 

using memfun_t = void (test::*)(); 
memfun_t mf = &test::f; 


auto a1 = &test::f; // OK 
auto a2 = t1.*mf; // error 
auto a3 = &(t1.*mf); // still no luck 

任何想法爲什麼這不能被推斷?我希望引用標準的答案。汽車未能推斷出?

編輯:

我發現,似乎是解決這一問題的RAD Studio語言的擴展名爲__closure。 1下面是代碼:

class base { 
public: 
    void func(int x) { 
    }; 
}; 

typedef void(base::*pBaseMember)(int); 

class derived : public base { 
public: 
    void new_func(int i) { 
    }; 
}; 

int main(int argc, char * argv[]) { 
    derived derivedObject; 
    void(__closure * derivedClosure)(int); 

    // Get a pointer to the ‘new_func’ member. 
    // Note the closure is associated with the 
    // particular object, ‘derivedObject’. 
    derivedClosure = derivedObject.new_func; 

    derivedClosure(3); // Call ‘new_func’ through the closure. 
    return 0; 
} 

http://docwiki.embarcadero.com/RADStudio/Seattle/en/Closure

回答

1

不能使用

auto a2 = t1.*mf; // error 

就像你不能用:

auto a2 = t1.f; 

t1.f不是有效表達。無法通過類的實例獲取指向成員函數的指針。與非成員函數不同的是,成員函數在使用時會衰減爲函數指針,因此成員函數不會衰減到成員函數指針。

從C++ 11標準相關的文字:

一元運算符

...

4當使用顯式&僅形成一個指向構件和其操作數是不包含在括號內的限定符號。 [注:即,表達&(qualified-id),其中qualified-id括在括號中,不形成類型的表達式「指針構件。」無論確實qualified-id,因爲存在從合格-ID的隱式轉換對於類型爲「指向成員函數的指針」的非靜態成員函數,從函數類型的左值到類型「指向函數的指針」(4.3)。 &unqualified-id也不是指向成員的指針,即使在不合格ID的類的範圍內。 - 結束]

+0

那麼這就是現在的問題,不是嗎?爲什麼它不能推導出成員函數指針? – Lenz

+1

@倫茨,如果'mf'不是帖子的一部分,那將是個問題。 –

+0

@Lenz:它不能推導出一個成員函數指針,因爲只能推導出有效的表達式,並且它不是一個有效的表達式。爲什麼它不是一個有效的表達?因爲這些是C++成員函數和成員指針的規則。 –