【问题标题】:C++ spooky constructor [duplicate]C ++幽灵构造函数[重复]
【发布时间】:2012-01-18 12:54:08
【问题描述】:

可能重复:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?

让我们有这个代码

class Foo {
  Foo(int) { }
};

那么我们就有了结果:

int main() {
  Foo f1 = Foo(5); // 1: OK, explicit call
  Foo f2(5); // 2: OK, implicit call
  Foo f3(); // 3: no error, "f3 is a non-class type Foo()", how so?
  Foo f4(f1); // 4: OK, implicit call to default copy constructor
  Foo f5; // 5: expected error: empty constructor missing
}

你能解释一下3的情况吗?

【问题讨论】:

  • 搜索:恼人的解析
  • @Nim:应该是一个答案。
  • 另请注意,示例 5 正在执行示例 3 的预期操作并调用默认构造函数。
  • @BjörnPollex,最近,我开始使用适当的搜索词进行评论 - 有时,这只是缺少术语的问题,然后 OP 可以自己发现.. :) 无论如何,我知道有人会更快地给出真正的答案.. ;)

标签: c++ constructor most-vexing-parse


【解决方案1】:

第三行被解析为声明一个不带参数并返回Foo的函数。

【讨论】:

    【解决方案2】:

    Foo f3(); 声明了一个名为f3 的函数,返回类型为Foo

    【讨论】:

    • 啊,当然!我非常专注于构造函数...
    【解决方案3】:

    C++ 有一个规则,如果一个语句可以被解释为一个函数声明,它就会被这样解释。

    因此语法Foo f3();实际上声明了一个不带参数并返回Foo的函数。通过编写Foo f3; 来解决这个问题,它也会调用默认构造函数(当然,如果有的话)。

    【讨论】:

      【解决方案4】:
      • f1 在显式调用后调用复制构造函数,你错了这个
      • f2 是一个显式的构造函数调用 // 你也错了
      • f3 声明一个函数
      • f4 又是复制构造函数,就像 f1 // 你就在这里
      • f5 会调用默认构造函数 // 你又来了

      【讨论】:

      • Foo f6 = 5; 会通过隐式构造函数调用吗? IIRC。
      • @Douglas:是的,那是正确的。
      【解决方案5】:

      这不是你想的那样:

       Foo f3();
      

      您可能认为这是对默认构造函数的显式调用,但事实并非如此。它实际上是一个名为 f3 的函数的声明,它不接受任何参数并按值返回 Foo

      这被解析为函数声明而不是构造函数调用被称为Most Vexing Parse

      【讨论】:

      • 不,不是。 MVP 是当您提供参数时,它仍然看起来像一个函数声明。这不是MVP,只是程序员很傻
      【解决方案6】:

      您已经定义了一个名为 f3 的函数,它在案例 3 中返回一个 foo。在案例 5 中,您没有定义默认构造函数,因此您会收到错误。

      【讨论】:

        猜你喜欢
        • 2018-10-17
        • 1970-01-01
        • 2014-12-17
        • 2014-08-21
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多