Почему `int * Get ()` вызывается из `const int & Get ()`? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть класс B, который имеет два метода, один из которых возвращает указатель на переменную-член, а другой возвращает константную ссылку на переменную.

Я пытаюсь вызвать эти методы.Во время вызовов я сохраняю возвращаемые значения для соответствующих типов возврата.

Я ожидал, что соответствующие типы возврата в конечном итоге вызовут соответствующие методы, но я получаю сообщение об ошибке компиляции:

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(); 
}

Ответы [ 5 ]

0 голосов
/ 24 мая 2018

Существует две вещи

  1. тип возврата не учитывается в разрешении перегрузки
  2. Постоянство метода учитывается в разрешении перегрузки

Есливы удалите const во втором методе, компилятор пожалуется на неоднозначность.

0 голосов
/ 24 мая 2018

Как уже ответили, тип возврата не учитывается.Итак, я вижу 3 возможных решения:

1 делает его частью сигнатуры функции:

class B {
public:
   void Get( int *&refptr );
   void Get( int &refval ) const;
};

int main(){
  B b;
  int refval2 = 0;
  b.Get( refval2 ); 
  int* pval2 = nullptr;
  b.Get( pval2 ); 
}

, но это приводит к довольно уродливому коду, поэтому вам лучше использовать метод 2 или 3 -

2 использовать разные имена функций, это довольно очевидно

3 использовать игнорируемый параметр:

class B {
public:
   int *Get( nullptr_t );
   const int &Get() const;
};

int main(){
  B b;
  const int &refval2 = b.Get();
  int* pval2 = b.Get( nullptr ); 
}
0 голосов
/ 24 мая 2018

Проблема в том, что компилятор считает, что две функции Get () одинаковы.Если вы создаете две идентичные функции только с различными типами возвращаемых данных, компилятор не знает, какую функцию вы хотите использовать.Чтобы устранить проблему, измените имя одной или обеих функций Get ();скажем GetXPtr () и GetX ().

0 голосов
/ 24 мая 2018

Почему int* Get() называется insted из const int& Get()?

const int & Get() const

Является const функцией-членом.

Из класса.this :

Если объявлена ​​функция-член const, тип this будет const X*

Однако вы объявили:

B b;

как non-const, который вызовет функцию non-const int* Get().Таким образом, ошибка.

0 голосов
/ 24 мая 2018

Тип возвращаемого значения не является частью сигнатуры функции , он не учитывается в разрешении перегрузки .

В общем случае функция-кандидат, параметры которой наиболее точно соответствуют аргументам, вызывается.

Для вызова не статической функции-члена типвызываемый объект тоже включает в себя.Их два Get(), один константный, другой неконстантный.Для b.Get(); неконстантное Get() является точным соответствием;для вызова const Get() объект b должен быть преобразован в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...