`(&)()`在C ++编译器错误消息中的含义是什么

时间:2014-05-07 11:54:08

标签: c++ g++

这个错误是什么意思?

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&);

我的函数调用签名与我的定义签名有何不同,(&)()是什么意思?

5 个答案:

答案 0 :(得分:7)

嗯,仅(&)()并不意味着什么。 (&)()只是Qux (&)()的一部分,这意味着引用到一个不带任何内容并返回Qux的函数。而这是因为:

Qux qux();      //PROBLEM!
this->bar(qux);

这里的第一行不声明对象。它声明了一个函数。

在C ++中搜索烦恼的解析,在这个网站上,你会看到很多关于它的话题,详细讨论这个问题。

答案 1 :(得分:3)

您应该使用Qux qux;(或者使用C ++ 11 Qux qux{};)来避免使用most vexing parse

答案 2 :(得分:1)

表达式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 (&)())`

这意味着在调用的地方,第一个参数是 lvalue-expression 表示对象(好吧,函数不是对象,但对我来说)键入Qux(),这是一个不带参数的函数,并按值返回Qux

在这种特殊情况下,参数是非const lvalue-expression,读取并不比解析类型本身更令人困惑,但在其他情况下,重要的是要注意这不是一个签名。例如,如果错误消息是:

error: no matching function for call to `foo::bar(Qux)`

为什么唯一的候选人不是一个完美的匹配可能是不明显的,它是不是需要Qux,这是你告诉我的正在通过的?除了此语法表示使用 rvalue-expression 的调用,该调用不能被左值 - 引用绑定。

同样,如果参数是const Qux 左值,则错误可能是:

error: no matching function for call to `foo::bar(const Qux&)`

指示参数是 lvalue-expression ,但类型为const Qux,它再次不能被非const 左值 - 引用绑定。

阅读错误信息本身就是一门艺术,但它是这项工艺的重要组成部分。每当您使用编译器使用的语言出错时,您应该注意,因为这将有助于您在下次看到类似的错误消息时理解该问题。

答案 3 :(得分:0)

Qux qux();

声明一个不带参数的函数并返回Qux。 你应该写

Qux qux;

定义Qux类型的对象。

答案 4 :(得分:0)

Qux qux();

这是一个功能声明。

this->bar(qux);

这是尝试将对qux函数的引用传递给bar

如果您想默认构建qux,请忽略()

Qux qux;