C++ 为什么变量是函数而不是对象?

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

<分区>

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

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

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 的调用会返回一些传递给 Class2 的构造函数的匿名 Class1。

最佳答案

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

备选方案:

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

关于C++ 为什么变量是函数而不是对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23696716/

相关文章:

c++ - 是否可以在文字地址处更改 float (值)?

c# - 从已部署的应用程序中检索最后一次提交 ID/修订号

C - 使用文件处理和链表登录

javascript - 根据单独的对象键、值过滤对象数组

javascript - 应用程序以某种方式将不需要的参数写入对象

C++ 按顺序打印数组列表?

c++ - C++是否也保留标准库函数名?

c++ - 错误 C2660 : function does not take 2 arguments C++

c# - 带返回值的递归函数VS使用OUT参数

c++ - 其他对象中的对象真的共享同一个地址吗?