2015-05-22 99 views
4

我發現這個處理多個函數指針解引用的代碼意外地編譯,儘管看起來不是有效的。這如何編譯?這是編譯器中的錯誤嗎?我在Ubuntu 14.04上使用gcc 4.8.2。爲什麼要在函數指針或返回函數指針的函數compliles之前放幾十個*?

int addInt(int n,int m)  // function 
{ 
    return n+m; 
} 

int (*(*functionFactoryPtr)(int n))(int, int); // pointer 

int (*(functionFactory)(int n))(int, int) // function 
{ 
    std::cout << "Got parameter" << n << std::endl; 
    int (*functionPtr)(int,int) = &addInt; 
    return functionPtr; 
} 

int main() 
{ 
    // functionFactoryPtr = @functionFactory; 
    std::cout << (******(*****functionFactory)(4))(3,6) << std::endl; // How is this not an error? 

} 
+5

衰變mayhap:對函數的引用在帽子下落時衰減到函數指針。 '*'返回一個引用:下一個'*'衰減引用的功能然後解除引用它?等等。 – Yakk

+0

好吧..它在C中崩潰。它只是在C++中有效。 – Brandon

+0

是的,這是有道理的@雅克 –

回答

3

函數lvalue可隱式轉換爲函數指針([conv.func])。在你的例子中,函數在每次解引用前轉換爲一個指針。