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

时间:2018-05-24 00:26:55

标签: c++ c++11 overload-resolution

我有一个类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(); 
}

2 个答案:

答案 0 :(得分:6)

Return type is not part of function signatureoverload 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)

有两件事

  1. 在重载决策中不考虑返回类型
  2. 在过载分辨率中考虑方法的约束
  3. 如果在第二种方法中删除const,编译器会抱怨歧义。