2013-08-02 21 views
1

我一直在尋找在emulated version of nullptr見到了這個轉換操作符(nullptr_t的成員):如何模板變換運營商成員函數指針語法工作

template<class C, class T> // or any type of null 
operator T C::*() const  // member pointer... 
{ return 0; } 

這句法成員函數指針混淆了我。我通常期望看到這樣的類型,如

R (C::*)(I1, I2, ...) 

使用上面的模板,沒有輸入參數。我無法弄清楚在這種情況下類型扣除是如何工作的。我無法形成一個具體的問題,除此之外,這是如何工作的?如果我有這樣的代碼:

typedef int (MyClass::*MyTypedef)(float); 
MyTypedef m = nullptr; 

我猜T推導爲int,C推導到MyClass。發生什麼「浮動」?

回答

2

即一個指針構件,不一定是指針構件函數。區別在於它可以生成一個指向成員函數的指針或一個指向非函數成員的指針。

現在在特定的用例中,目的地是一個指向成員的指針,編譯器看到一個表達式,它需要一個int (MyClass::*)(float),另一方面它有一個nullptr。它試圖找到一個轉換,它找到operator T C::*(),如果C推導爲MyClass並且T推導爲int (float) [函數採取float並返回int],則這是有效的轉換。

我也發現了語言的這種特殊的角落有點混亂(具有類型定義,或功能推斷類型),例如這是如果怪異法律:

typedef void int_f(int); 
struct X { 
    int_f m; 
}; 
void X::m(int x) { std::cout << x << '\n'; } 

同樣的事情是怎麼回事在您關心的轉換運算符中。

+0

如果將類型解析爲其組成部分,則替換更有意義。 'TC :: * [指向類型爲[T]]的類C的成員的指針',其中'[T]'被替換爲'T(P)[取P並返回[T]]的結果'T :: *)(P)[指向類型爲[函數P返回[T]]的類C的成員的指針]'。請參閱http://stackoverflow.com/questions/17142130/what-are-the-expression-syntax-over-types-c-support/17147477#17147477 – willj