不是专家,所以当我注意到以下行为时,我不清楚为什么会这样 - 感谢有人解释。
class Example
{
public:
Example() {}
};
int main()
{
Example ex (Example());
cout << typeid(ex).name() << endl;
}
结果:
class Example __cdecl(class Example(__ cdecl *)(void))
非默认构造函数初始化&#34;类的实例&#34;正如所料。当然,赋值初始化也可以按预期工作。
Example ex2 = Example();
类示例
答案 0 :(得分:3)
此
Example ex (Example());
是一个名为ex
的函数声明,其返回类型为Example
,参数类型为Example()
,其中Example()
又是一个具有返回类型的函数类型示例没有参数..
同样的声明可以像
一样重写Example ex (Example ( * )());
因为作为参数传递的函数被隐式转换为指向函数的指针。
在这种情况下,如果要调用复制构造函数,则必须提供表达式作为参数
Example ex ( ( Example() ) );
或
Example ex ( { Example() } );
至于此声明
Example ex2 = Example();
然后使用了一个初始化程序,它是一个表达式,表示自己是默认构造函数的调用。
考虑这个令人困惑的笑声示例
#include <iostream>
class Example
{
public:
Example() {}
};
Example ex() { return Example(); }
int main()
{
Example ex( Example() );
ex( ::ex );
}
Example ex( Example ( ex() ) )
{
std::cout << "Example ex( Example ( ex() ) ) is called" << std::endl;
return ex();
}