C ++最令人烦恼的parsing

直接从http://herbsutter.com/2013/05/09/gotw-1-solution/取得

虽然widget w(); 对我来说很清楚,我不知道下面的代码怎么能成为一个函数声明?

 // same problem (gadget and doodad are types) // widget w( gadget(), doodad() ); // pitfall: not a variable declaration 

这怎么可能?

在函数声明中,types数组的参数衰减成指向第一个元素的指针,types函数的参数衰减成函数指针,所以签名是:

 widget w( gadget(*)(), doodad(*)() ); 

也就是说,一个函数将第一个参数作为指向不带参数的函数的指针,并返回gadget ,第二个参数指向一个不带参数的函数的指针,并返回一个widget ,并且函数本身返回一个widget

还有更多有趣或令人困惑的情况,例如:

 // assume 'x' is a variable defined somewhere: widget w(gadget(x)); 

这怎么可能被解释为函数声明呢? 我的意思是, x是一个variables,对不对? 那么,当声明一个variables,你可以添加额外的括号,所以gadget x;gadget (x); 都声明相同的variablesx 。 这同样适用于函数参数,所以上面的代码看起来像一个函数声明,该函数接受一个名为xgadgettypes的第一个参数并返回一个widget

这是函数,得到两个函数,返回gadgetdoodad ,其中任何一个都没有参数。

编译好的例子。

 #include <iostream> class widget{}; class gadget{}; class doodad{}; gadget a(){} doodad b() {}; widget w( gadget(), doodad() ){ } int main() { w(a,b); return 0; } 

http://ideone.com/YjZK9Y