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的gadgettypes的第一个参数并返回一个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; }