【问题标题】:Invalid object after elision of copy operation? [duplicate]复制操作省略后对象无效? [复制]
【发布时间】:2012-07-26 11:09:22
【问题描述】:

可能重复:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?
Most vexing parse: why doesn't A a(()); work?

这个让我很生气。也许它太简单了。

struct Foo
{
  Foo() {}
  Foo(const Foo& f) {}
  void work() {}
};

int main()
{
  Foo f( Foo() );
  f.work();
}

GCC 4.6 给了我:

error: request for member ‘work’ in ‘f’, which is of non-class type ‘Foo(Foo (*)())’

省略复制操作后,有效代码可能如下所示:

int main()
{
  Foo f;
  f.work();
}

但是为什么我不能打电话给work() ??

编辑:

是的,重复(见下文)。第一次搜索时没有找到原始帖子,因为这个症状的来源位于我没想到的地方。

【问题讨论】:

  • 你为什么要写Foo f( Foo() );,写Foo f;有什么问题,应该可以按预期工作。您的第一个版本创建了一个完全不同的类型,您可以在错误消息中看到。
  • 当然有点学术。来自对构造函数的研究

标签: c++ most-vexing-parse


【解决方案1】:

因为Foo f( Foo() ); 是一个函数声明。

我想你想要:Foo f;

或者如果你想复制构造:

Foo f( (Foo()) );

【讨论】:

  • 基本块中不允许函数声明。怎么能这么解释呢?
  • @Frank:看看这里:stackoverflow.com/questions/1424510/…
  • 实际上你可以在函数内部写这样的东西:int bar(int a, int b);。它会编译
  • 是的,编译器似乎允许/接受函数声明。不是定义。都有一个基本块
  • @Frank:是的,不允许定义
【解决方案2】:

f 实际上是 main 函数中的函数声明。 试试

Foo f((Foo())); // to make the definition of f explicit enough.

【讨论】:

    【解决方案3】:

    n3337 8.2

    由函数样式之间的相似性引起的歧义 cast 和 6.8 中提到的声明也可以出现在上下文中 的声明。在这种情况下,选择是在一个函数之间 在参数周围带有一组冗余括号的声明 名称和具有函数样式转换的对象声明作为 初始化器。正如 6.8 中提到的歧义一样, 决议是考虑任何可能是 声明一个声明。 [注意:声明可以显式 通过非函数式强制转换消除歧义,通过 = 表示 初始化或删除多余的括号 参数名称。 — 尾注] [ 示例:

    struct S {
    S(int);
    };
    void foo(double a) {
    S w(int(a));
    //function declaration
    S x(int());
    //function declaration
    S y((int)a);
    //object declaration
    S z = int(a);
    //object declaration
    }
    

    —结束示例]

    【讨论】:

      【解决方案4】:

      C++ 解析器将Foo f(Foo()); 表达式解释为带有签名Foo(Foo(*)()) 的函数声明,即返回Foo 的函数并将函数指针指向返回Foo 的函数。在参数周围添加显式括号,如Foo f((Foo())); 将解决歧义。但是考虑一下实际上只是做Foo f;,这样可以避免冗余代码。

      【讨论】:

      • 基本块中不允许函数声明。怎么能这么解释呢?
      • @Frank 那是 C 的遗产 link
      猜你喜欢
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      相关资源
      最近更新 更多