为什么`int*Get()`被称为`const int&Get()`?

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)

son*_*yao 6

返回类型不是函数签名的一部分,重载解析时不考虑它.

通常,参数与参数最匹配的候选函数是被调用的候选函数.

对于非静态成员函数调用,要调用的对象的类型也涉及.有两个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)

  • @codekaizer:`b`是非常量的,因此总是调用非常量`Get`.`cb`是const,所以总是调用const`Get`.它取决于具有成员的类的类型,而不是返回值. (5认同)