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

C++ Why is variable a function and not an object?

本文关键字:对象 函数 变量 为什么      更新时间:2023-10-16

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

无论如何,我有这样的代码:

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的构造函数。

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

替代:

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

这是因为这一行

Class2 x( Class1());

实际上声明了一个函数而不是一个对象。这就是所谓的解析。为了避免这个问题,你应该这样写:

Class2 x((Class1()));

Class1 y;
Class2 x( y);