我仍然对CTOR感到困惑:
问题1:
为什么第15行拨打A:A(int)
而不是A:A(double&)
?
问题2:
为什么第18行没有拨打A:A(B&)
?
#include <iostream>
using namespace std;
class B{};
class A{
public:
A(int ) {cout<<"A::A(int)"<<endl;}
A(double&){cout<<"A::A(double&)"<<endl;} // it will work if it is A(double), without the &
A(B&){cout<<"A::A(B&)"<<endl;}
};
int main()
{
/*line 15*/ A obj((double)2.1); // this will call A(int), why?
B obj2;
A obj3(obj2);
/*line 18*/ A obj4(B); // this did not trigger any output why?
}
答案 0 :(得分:6)
第15行: A(double&)
只能使用左值,即可以分配的变量。 (double)2.1
是一个右值。如果您还需要接受rvalues作为参考,请使用A(const double&)
。
第18行: B
是一种类型,而不是一种值。 A obj4(B);
仅声明名为obj4
的函数,其中B
并返回A
。
答案 1 :(得分:3)
您的引用构造函数仅接受对非const
对象的引用。
也就是说,你写道:
A(int) { cout<<"A::A(int)"<<endl; }
A(double&) { cout<<"A::A(double&)"<<endl; }
A(B&) { cout<<"A::A(B&)"<<endl; }
而不是:
A(int) { cout<<"A::A(int)"<<endl; }
A(double const&) { cout<<"A::A(double const&)"<<endl; }
A(B const&) { cout<<"A::A(B const&)"<<endl; }
这个问题在于,在A obj((double)2.1)
中,您使用临时对象调用了构造函数(在本例中,是双文字2.1
(强制转换为{{ 1}}没有意义),临时对象可能无法绑定到不引用double
的引用。
因此无法调用const
构造函数;唯一可能匹配的是A(double&)
,并且对您的数据(A(int)
→2.1
)执行所需的转换以实现此目的。 (你的编译器will normally warn you发生这种情况。)
因此,请使用接受2
的引用的构造函数形式。
至于您的const
,A obj4(B)
是一种类型,因此您声明了一个名为B
的函数,该函数接受(未命名)obj4
并返回{{1 }}
答案 2 :(得分:0)
因为&
表示它是引用类型,而在第15行,您传递的是值,而不是引用。
答案 3 :(得分:-1)
第15行,double是一个rvalue(临时),不能转换为非const引用。对于第18行,最可能的解释是您的编译器只是优化了构造函数调用。