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
。 这同样适用于函数参数,所以上面的代码看起来像一个函数声明,该函数接受一个名为x
的gadget
types的第一个参数并返回一个widget
…
这是函数,得到两个函数,返回gadget
和doodad
,其中任何一个都没有参数。
编译好的例子。
#include <iostream> class widget{}; class gadget{}; class doodad{}; gadget a(){} doodad b() {}; widget w( gadget(), doodad() ){ } int main() { w(a,b); return 0; }