似乎 GCC 处理函数声明的方式存在问题。举个例子:
struct A
{
bool operator () () { return true; }
};
struct B
{
B(bool) { }
};
B b(( // This cannot be parsed as a function declaration,
A()() // and yet GCC 4.7.2 interprets it as such:
)); // "error: 'type name' declared as function returning
// a function B b((A()()));"
int main() { }
由于 周围存在额外的括号A()()
,语法形式B b(( A()() ));
不能被解析为函数的声明。
您问题示例中的声明略有不同:
B b(
(A())()
);
但是,即使在这种情况下,(A())()
也不能将其解释为返回函数的函数类型A
(总是试图将其视为b
带有未命名参数的函数声明)。所以问题是:它可以被解释为其他什么吗?如果是这样,并且如果它在这种情况下有意义,那么编译器应该考虑将整个表达式解析为 object 的构造b
。
这可能是 GCC 和 Clang 不同意的根本点:
int main()
{
(A())(); // OK for Clang, ERROR for GCC
}
A
除了尝试构造一个临时类型并调用其调用运算符之外,我看不出如何将上述内容解释为其他任何东西。它不能是函数声明,因为如果A
被解释为返回类型,则名称丢失(反之亦然)。
另一方面,(A())
是创建临时类型的有效表达式A
,并且该临时支持调用运算符(其返回类型与 的构造函数接受的类型相同B
)。因此,(A())()
应该是 type 的有效表达式bool
。
由于这个原因,我认为GCC的解析是错误的。