mat*_*ato 4 c++ overload-resolution c++11
我有一个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();
}
Run Code Online (Sandbox Code Playgroud)
返回类型不是函数签名的一部分,在重载解析时不考虑它.
通常,参数与参数最匹配的候选函数是被调用的候选函数.
对于非静态成员函数调用,要调用的对象的类型也涉及.有两个Get(),一个是const,一个是非const.因为b.Get();,非const Get()是精确匹配; 对于Get()要调用的const ,必须将对象b转换为const.然后,非const 1胜后,编译器将尝试返回转换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()
Run Code Online (Sandbox Code Playgroud)