我有一个类B
,它有两个方法,其中一个返回指向成员变量的指针,另一个返回对该变量的const引用。
我尝试调用这些方法。在调用期间,我将返回值存储到相应的返回类型。
我期待适当的返回类型最终会调用适当的方法,但是我收到编译错误说:
error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive] const int& refval2 = b.Get(); `
这是我的代码:
#include <iostream>
class B{
public:
int* Get(){
return &x_;
}
const int & Get() const{
return x_;
}
private:
int x_ = 0;
};
int main(){
B b;
const int& refval2 = b.Get();
int* pval2 = b.Get();
}
答案 0 :(得分:6)
Return type is not part of function signature,overload resolution未考虑此问题。
通常,参数最接近参数的候选函数是被调用的候选函数。
对于非静态成员函数调用,要调用的对象的类型也涉及。那里有两个Get()
,一个是const,一个是非const。对于b.Get();
,非const Get()
是完全匹配的;要调用const Get()
,必须将对象b
转换为const
。然后非const获胜,之后编译器将尝试将返回的int*
转换为const int&
并失败。
所以
B b;
int* pval2 = b.Get(); // call to non-const Get()
const B cb;
const int& refval2 = cb.Get(); // call to const Get()
答案 1 :(得分:1)
有两件事
如果在第二种方法中删除const,编译器会抱怨歧义。