C++ 为什么我需要双括号 ;在构造函数中调用如下:foox((bar());

C++ 为什么我需要双括号 ;在构造函数中调用如下:foox((bar());,c++,compiler-theory,most-vexing-parse,C++,Compiler Theory,Most Vexing Parse,可能重复: 我已经看到了嵌套的构造函数调用和支撑,并且总是想知道C++分析器如何解析两个,以及为什么解析器不可能解析它。 所以我明白了为什么foo xxx()不明确。但是是什么使得foox(bar())不明确,因为它显然没有转发声明。(即:应该有一个语法可以成功地检测到这一点) 有人能解释C++语法中的那部分的局限性和模糊性吗?< /P> < P> C++ FQA是一堆垃圾。别理它 至于foox(bar()),它与foox()一样模棱两可,除了x的类型也包含一个参数,该参数是一个函数。在这里加

可能重复:

我已经看到了嵌套的构造函数调用和支撑,并且总是想知道C++分析器如何解析两个,以及为什么解析器不可能解析它。 所以我明白了为什么

foo xxx()不明确。但是是什么使得
foox(bar())不明确,因为它显然没有转发声明。(即:应该有一个语法可以成功地检测到这一点)


有人能解释C++语法中的那部分的局限性和模糊性吗?< /P> < P> C++ FQA是一堆垃圾。别理它

至于
foox(bar())
,它与
foox()
一样模棱两可,除了
x
的类型也包含一个参数,该参数是一个函数。在这里加一个指针,你就会明白我的意思了

foo (*x)();
foo (*x)(bar(*)());
即使允许这样做的想法也不傻,但现在没有人能改变它

(我暗自怀疑这条语法有点不对劲,但我相信有人会纠正我的)

这可以是:

1) 名为
x
的变量的声明,该变量的值是默认构造的
。这与
foox=bar()相同


2) 一个名为
x
的函数的声明,该函数返回
foo
并接受一个参数——一个返回
bar
且不接受任何参数的函数。这与
foox(bar(void))相同

谷歌“最烦人的解析”您链接的常见问题条目解释了这一点。下面第三段。这些是大括号:
{}
。这些是括号:
()
。我不认为这里的
x
是一个函数指针,只是一个函数声明,在使用时会衰减为指针。不是的,我只是添加了指针,以便更清楚地说明它的等效性。这就是我的观点,2不是一个无效的声明吗?或者这意味着什么?这是否意味着bar是一个函数原型,foo将函数指针作为第一个参数?那不是应该是bar(*)吗?不,2不是无效的声明
foo x(bar(void))
表示
x
是一个返回
foo
并获取
bar(*)(void)
的函数。
(*)
不必显式的原因是函数声明有一条规则,即如果参数类型是函数类型,则该参数被“调整”为指向该函数类型的指针。这与规则完全相同,如果参数是数组,则“调整”为指针类型
void a(int x[])
完全等同于
void a(int*x)
foox(bar())
相当于
foox(bar(*)()
foo x(bar());