直接取自 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
这怎么可能?
最佳答案
在函数声明中,数组类型的参数衰减为指向第一个元素的指针,函数类型的参数衰减为函数指针,因此签名将是:
widget w( gadget(*)(), doodad(*)() );
也就是说,一个函数将一个指向不带参数的函数的指针作为第一个参数并返回gadget
,该函数将一个指向不带参数的函数的指针作为第二个参数并返回一个doodad
并且函数本身返回一个 widget
还有更有趣或更令人困惑的案例,例如:
// assume 'x' is a variable defined somewhere:
widget w(gadget(x));
那个怎么可能被解释为一个函数声明呢?我的意思是,x
是一个变量,对吧?好吧,当声明一个变量时,你可以添加额外的括号,所以 gadget x;
和 gadget (x);
都声明了相同的变量 x
。这同样适用于函数参数,所以上面的代码看起来像一个函数的声明,它接受一个名为 x
类型为 gadget
的第一个参数并返回一个 widget
...
关于C++ 最令人头疼的解析又来了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16588750/