C++ C++';这又是最令人烦恼的

C++ C++';这又是最令人烦恼的,c++,c++11,gotw,C++,C++11,Gotw,直接取自 而widget w()对我来说很清楚,我不知道下面的代码怎么可能是函数声明 // same problem (gadget and doodad are types) // widget w( gadget(), doodad() ); // pitfall: not a variable declaration 这是怎么可能的?在函数声明中,数组类型的参数衰减为指向第一个元素的指针,函数类型的参数衰减为函数指针,因此签名为: widget w( gadget(*)(), dood

直接取自

widget w()对我来说很清楚,我不知道下面的代码怎么可能是函数声明

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

这是怎么可能的?

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

widget w( gadget(*)(), doodad(*)() );
也就是说,函数的第一个参数是指向不带参数并返回
小部件的指针,第二个参数是指向不带参数并返回
小部件的指针,函数本身返回
小部件

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

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

如何将其解释为函数声明?我的意思是,
x
是一个变量,对吗?好的,当声明变量时,可以添加额外的括号,因此
gadget x
小工具(x)
两者都声明相同的变量
x
。这同样适用于函数参数,因此上面的代码看起来像一个函数的声明,该函数接受类型为
gadget
的名为
x
的第一个参数,并返回一个
小部件

函数得到两个函数,返回
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;
}
#包括
类控件{};
类gadget{};
doodad{}类;
小工具a(){}
doodad b(){};
小部件w(gadget(),doodad()){
}
int main(){
w(a,b);
返回0;
}

上帝之母。ಠ_ಠ+第一次知道函数类型的参数会衰减为函数指针。谢谢大家!@Yanko:当然,这就是为什么现在你可以使用
widget w{gadget{},doodad{}=>这不能被误解为函数:)@MatthieuM。对于那些有幸使用C++11:)@DavidRodríguez dribeas:恐怕我还很幸运。。。至少,在工作中。