再次C ++的最棘手的解析(C++'s most vexing parse again)

2019-09-03 17:33发布

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

这怎么可能?

Answer 1:

在函数声明,类型的阵列衰减参数到指针的第一个元素,型函数衰变到一个函数指针的参数,所以签名将是:

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 ...



Answer 2:

它的功能增加了两个功能,即返回gadgetdoodad ,要么他们就没有得到论证。

例如,编译细。

#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



文章来源: C++'s most vexing parse again
标签: c++ c++11 gotw