【问题标题】:C++ Why is variable a function and not an object? [duplicate]C++ 为什么变量是函数而不是对象? [复制]
【发布时间】:2014-05-16 13:43:26
【问题描述】:

这个标题可能并不完全准确——它是基于我对正在发生的事情的最佳猜测,我认为它比“有人可以解释这段代码发生了什么吗?”更好

无论如何,我有这个代码:

class Class1 { };

class Class2
{
public:
   Class2(Class1 other){}
};

void func(Class2 x){}

int main()
{
   Class2 x(Class1());
   func(x);             //Compile Error

   Class1 y1;
   Class2 y2(y1);
   func(y2);            //Compiles fine
   return 0;
}

所以当我编译它时,标记为“编译错误”的行在 g++ 4.9 中提供了一个错误:

main.cpp: In function ‘int main()’:
main.cpp:14:10: error: could not convert ‘x’ from ‘Class2 (*)(Class1 (*)())’ to ‘Class2’
    func(x);
          ^

clang++ 3.4.1 提供了类似的错误。

我最好的猜测是它认为“x”是某种返回 Class2 的函数,而不是 Class2 本身,但是……为什么会这样?我认为对 Class1 的调用会返回一些匿名 Class1,它会被传递到 Class2 的构造函数中。

【问题讨论】:

  • 我恢复了您的编辑。请不要添加问题的答案。这就是答案的目的。

标签: c++ function object most-vexing-parse


【解决方案1】:

Class2 x(Class1()); 是一个函数声明,由于令人烦恼的解析(谷歌技能在这里派上用场)。

替代方案:

Class2 x((Class1()));
Class2 x{Class1()};

【讨论】:

  • 太棒了!在接受按钮解锁的 11 分钟内,我会接受这个答案。谢谢你的帮助!我以前没有听说过“令人烦恼的解析”,如果没有这个特定的术语,在谷歌上搜索解决方案有点困难 :-) 再次感谢。
【解决方案2】:

这是因为这条线

Class2 x( Class1());

实际上声明了一个函数而不是一个对象。这被称为恼人的解析。 为了避免这个问题,你应该写:

Class2 x((Class1()));

或

Class1 y;
Class2 x( y);

【讨论】:

  • 感谢您的回答!
猜你喜欢
  • 2012-09-15
  • 2021-06-20
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
相关资源
最近更新 更多