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
。
+1和感謝。編譯器的消息可能會更清楚一點,然後說「衝突聲明Fun a(b)」! – TemplateRex
@rhalbersma,C++ 11擴展了初始化列表以使初始化明確無誤。 「Fun {a}(b)'將按預期進行解析。 – Vikas