【问题标题】:C++'s most vexing parse again [duplicate]C ++最令人烦恼的解析再次[重复]
【发布时间】:2013-05-16 13:27:37
【问题描述】:

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

这怎么可能?

【问题讨论】:

    标签: c++ c++11 gotw


    【解决方案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。这同样适用于函数参数,所以上面的代码看起来像一个函数的声明,它接受名为 gadget 类型的第一个参数 x 并返回 widget...

    【讨论】:

    • 上帝之母。 ಠ_ಠ
    • +1 第一次知道函数类型的参数衰减为函数指针。谢谢!
    • @Yanko:当然,这就是为什么现在你可以使用widget w{gadget{}, doodad{}}; => 这不能被误解为一个函数:)
    • @MatthieuM。对于那些有幸使用 C++11 的人 :)
    • @DavidRodríguez-dribeas:恐怕我还算幸运……至少在工作中。
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 2018-06-11
      • 2019-05-20
      相关资源
      最近更新 更多