1

我懷疑在下面的代碼中,由於最棘手的解析,對具有構造函數參數和函數調用操作符參數的臨時函數對象的調用在某種程度上是模棱兩可的問題。解析臨時函數對象調用中的歧義

#include <iostream> 

class Fun 
{ 
public: 
     explicit Fun(int i): v_(i) {} 

     void operator()(int j) const 
     { 
       std::cout << (v_ + j) << "\n"; 
     } 

private: 
     int v_; 
}; 

int main() 
{ 
     int a = 1; 
     int b = 2; 

     Fun(a)(b); // ERROR: conflicting declaration 'Fun a' 
     (Fun(a))(b); // OK: prints 3 
     return 0; 
} 

Ideone的輸出。

添加像(Fun(a))(b)這樣的括號可以解決問題,但我不能完全理解如何將Fun(a)(b)解析爲聲明Fun a

回答

2

不幸的是Fun(a)(b);可以解析爲Fun a(b);這是一個聲明,而不是臨時對象。

Most vexing parse

+0

+1和感謝。編譯器的消息可能會更清楚一點,然後說「衝突聲明Fun a(b)」! – TemplateRex

+1

@rhalbersma,C++ 11擴展了初始化列表以使初始化明確無誤。 「Fun {a}(b)'將按預期進行解析。 – Vikas

1

簡單的例子來理解函數聲明的語法:

#include <iostream> 

void (foo)(int a) { 
    std::cout << a << std::endl; 
} 

int main() { 
    foo(5); 
} 

所以你的情況,你必須使用:

Fun(a).operator()(b); 
(Fun(a))(b);