簡體   English   中英

`(&)()`在C ++編譯器錯誤消息中是什么意思

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM