1。如果我实例化此类对象,则不会发生错误。
class A {};
int main () {
A a = A ();
A &b = a;
return 0;
}
2. 如果我以这种方式实例化对象,编译器会在error C2440: 'initializing' : cannot convert from 'A (__cdecl \*)(void)' to 'A &'
的引用复制到a
时报告b
。
class A {
};
int main () {
A a();
A &b = a;
return 0;
}
3. 但是如果我添加一个带参数的构造函数并在实例化期间以第二种方式将一些参数传递给此ctor,则没有错误!
class A {
public:
A (int a) {}
};
int main () {
A a(5);
A &b = a;
return 0;
}
有人可以解释一下吗?
答案 0 :(得分:1)
在第二个示例中,编译器认为A a();
是一个返回A
a
的函数,它不带参数。
error C2440: 'initializing' : cannot convert from 'A (__cdecl *)(void)' to 'A &
表示编译器不知道如何将不带参数A
的{{1}}函数转换为(void)
类型的引用。
答案 1 :(得分:1)
当你创建对象" a"班级" A"并且你想要在没有参数的情况下调用构造函数,你不能写" A a();",而只是" A a;"。我曾经不时地犯这个错误。标准构造函数会自动调用。