40

直接取自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

这怎么可能?

4

2 回答 2

45

在函数声明中,数组类型的参数衰减为指向第一个元素的指针,函数类型的参数衰减为函数指针,因此签名将是:

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

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

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

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

怎么能被解释为函数声明呢?我的意思是,x是一个变量,对吧?好吧,当声明一个变量时,你可以添加额外的括号,所以gadget x;两者gadget (x);都声明了同一个变量x。这同样适用于函数参数,所以上面的代码看起来像一个函数的声明,它接受一个名为xtype的第一个参数gadget并返回一个widget...

于 2013-05-16T13:31:23.620 回答
1

它是一个函数,它有两个函数,它们返回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;
}

http://ideone.com/YjZK9Y

于 2013-05-16T13:33:23.110 回答