为什么在构造函数调用中需要双括号,如:foo x((bar()));

Ale*_*lex 4 c++ compiler-theory most-vexing-parse

可能重复:
为什么使用一组空括号来调用没有参数的构造函数是错误的?

我已经看到了关于嵌套构造函数调用和支撑的C++ FQA 条目,并且总是想知道C++解析器如何解析两个以及为什么解析器无法解析它.

所以我明白为什么foo xxx();是模棱两可的.然后foo x(bar());是什么使得模糊,因为它显然没有前瞻性声明.(即:应该有一个语法可以成功检测到这一点).

有人可以解释C++语法那部分的局限性和模糊性吗?

Dav*_*rtz 7

foo x(bar());
Run Code Online (Sandbox Code Playgroud)

这可以是:

1)变量的声明,x其值是默认构造的bar.这是一样的foo x = bar();.

2)一个函数声明,x它返回foo并接受一个参数 - 一个返回a bar并且不带参数的函数.这是一样的foo x(bar (void));

  • 不,2不是无效的声明.`foo x(bar(void))`表示`x`是一个返回`foo`的函数,并取'bar(*)(void)`.`(*)`不必是显式的原因是函数声明有一个规则,即如果参数类型是函数类型,那么参数被"调整"为指向该函数类型的指针.这与规则完全相同,如果参数是一个数组,它被"调整"为指针类型; `void a(int x [])`完全等同于`void a(int*x)`,而`foo x(bar())`相当于`foo x(bar(*)())`. (3认同)