这个标题可能不完全准确 - 它基于我对正在发生的事情的最佳猜测,我认为它比#34更好;有人可以解释这段代码发生了什么吗?&#34 ;
无论如何,我有这段代码:
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的构造函数。
答案 0 :(得分:4)
Class2 x(Class1());
是一个功能声明(谷歌技能在这里派上用场)。
替代:
Class2 x((Class1()));
Class2 x{Class1()};
答案 1 :(得分:2)
这是因为这一行
Class2 x( Class1());
实际声明一个函数而不是一个对象。这称为 vexing parse 。 要避免此问题,您应该写:
Class2 x((Class1()));
或
Class1 y;
Class2 x( y);