當與類的成員函數指針的處理,我們可以調用一個函數的對象實例的語法如下:調用一個成員函數指針的智能指針
struct X {
void foo();
};
X x; // Instance
auto f = &X::foo; // Member function pointer
(x.*f)(); // Call function f on x
有一個實例的原始指針時,語法是這樣的:
X *xptr = new X();
(xptr->*f)();
這很好地遵循靜態函數調用的比喻:
x.foo();
x->foo();
然而,當我有類的智能指針,這不起作用:
unique_ptr<X> xsptr(new X());
(xsptr->*f)(); // g++: error: no match for 'operator->*' in 'xsptr ->* f'
我解決這個問題,首先應用對其操作,然後用.
語法調用:
((*xsptr).*f)();
這是多醜?
編譯器是否應該拒絕上面的箭頭語法?因爲通常(靜態調用函數時),它會調用operator ->
。不應該->*
也只能撥打operator ->
?
編譯器錯誤部分回答了這個問題:錯誤讀取,我們可以重載operator ->*
調用一個成員函數指針解除引用的對象,這unique_ptr
不上。但是這引入了更多的問題。爲什麼智能指針不這樣做,如果語言需要這個?它是否打算而不是這樣做,因爲它引入了其他問題?爲什麼我們必須寫這個運算符而不是隱式地調用->
返回的對象上的成員函數指針呢? (因爲這是編寫xsptr->foo()
時的行爲)
爲什麼' - > *'爲非指針值會做什麼?編譯器不知道'unique_ptr'試圖模仿原始指針。 'operator - > *'是可重載的,但是乾淨地實現它卻很煩人。 – Xeo 2013-03-25 12:30:11
@Xeo我的意思是,標準可以很好地定義' - > *'的默認行爲,即「調用'operator->'」返回的對象上的成員指針,如下所示:'operator - > *(memptr){return((* this) - >)。* memptr(); }'。但是由於它不*這樣做,爲什麼C++ 11中的指針類型沒有定義這個運算符?有理由嗎? – leemes 2013-03-25 12:31:57
嗯,我想這也適用於C++ 03。 – leemes 2013-03-25 12:33:49