[英]What does `(&)()` mean in a C++ compiler error message
這個錯誤是什么意思?
error: no matching function for call to `foo::bar(Qux (&)())`
我知道編譯器(g ++)無法將函數調用與foo
成員函數匹配。 我特意詢問最后的額外內容; 這一點: (&)()
。
作為參考,我的函數調用是這樣的:
// inside another member function of `foo`
Qux qux();
this->bar(qux);
bar
的簽名是:
virtual void bar(Qux&);
編譯器還說唯一的候選者是:
virtual void bar(Qux&);
我的函數調用簽名與我的定義簽名有何不同, (&)()
是什么意思?
那么, (&)()
本身並不意味着什么。 (&)()
只是Qux (&)()
的一部分,這意味着引用一個不帶任何東西並返回Qux
。 這是因為:
Qux qux(); //PROBLEM!
this->bar(qux);
這里的第一行不聲明對象。 它聲明了一個函數。
在C ++中搜索vexing parse ,在這個網站上,你會看到很多關於它的主題,它會詳細討論這個問題。
你應該使用Qux qux;
(或者在C ++ 11中使用Qux qux{};
)以避免最令人煩惱的解析 。
表達式Qux (&)()
表示對不帶參數並返回Qux
的函數的引用。 其他人已經解釋過這一點。 但這並沒有真正解決[g ++] C ++編譯器錯誤消息中的(&)()
含義的具體細節?
當編譯器遇到無法解析的函數調用時,它試圖在錯誤中提供盡可能多的信息。 g ++中的這種特殊類型的錯誤被打印為多行,從第二行開始,編譯器將列出候選者的精確簽名以進行重載解析(即,在調用地點通過查找找到的函數名稱的已知重載)。 第一行有點棘手,因為它代表了實際的調用: this->bar(qux)
。 如果這是在錯誤信息打印你就必須弄清楚什么是類型不同的參數,尤其是什么類型this
和類型qux
。
g ++實現采用的方法是編寫類似函數簽名的東西,以某種方式表示調用。 問題是實際上不可能表示可以使用的限制性最小的簽名 ,因此它使用相同的語法,含義略有不同。
特別是, lvalue-expression參數將由表達式類型的(可能是const
) 引用表示,而rvalue-expression由非引用類型表示。 回到你得到的錯誤消息:
error: no matching function for call to `foo::bar(Qux (&)())`
這意味着在調用的地方,第一個參數是一個左值表達式,表示一個Qux()
類型的對象 (好吧,函數不是對象,但對我來說Qux()
,這是一個不帶參數的函數,並返回一個Qux
值。
在這種特殊情況下,參數是非const lvalue-expression,讀取並不比解析類型本身更令人困惑,但在其他情況下,重要的是要注意這不是真正的簽名 。 例如,如果錯誤消息是:
error: no matching function for call to `foo::bar(Qux)`
可能不明顯為什么唯一的候選人不是一個完美的匹配,它不是一個Qux
,這是你告訴我的正在通過? 除了這個語法表示一個帶有rvalue-expression的調用,該調用不能被lvalue-reference綁定。
類似地,如果參數是const Qux
左值 ,則錯誤可能是:
error: no matching function for call to `foo::bar(const Qux&)`
指示參數是左值表達式但是類型是const Qux
,它再次不能被非const 左值引用綁定。
閱讀錯誤信息本身就是一門藝術,但它是工藝的重要組成部分。 每當您使用編譯器使用的語言出錯時,您應該注意,因為這將幫助您在下次看到類似的錯誤消息時理解該問題。
Qux qux();
聲明一個不帶參數的函數並返回Qux
。 你應該寫
Qux qux;
定義Qux
類型的對象。
Qux qux();
這是一個函數聲明。
this->bar(qux);
那是試圖將函數qux
的引用傳遞給bar
。
如果你想默認構造qux
,請省略()
:
Qux qux;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.