const T *

#c #pointers #reference #overloading #overload-resolution

#c #указатели #ссылка #перегрузка #перегрузка-разрешение

Вопрос:

  • Почему следующий пример кода не создает двусмысленности
  • Есть ли какой-либо способ вызвать вторую версию? (Если это не ошибка)

 #include <iostream>
using namespace std;

void foo(const int*){cout << "no ref";}
void foo(const int*amp;){cout << "on ref";}

int main()
{
   int* i=nullptr;
   foo(i);
}
  

Редактировать:

Это

 #include <iostream>
using namespace std;

void foo(const int){cout << "no ref";}
void foo(const intamp;){cout << "on ref";}

int main()
{
   int i=0;
   foo(i);
}
  

Действительно создают двусмысленность.


Кстати, удалите значение const, создающее двусмысленность.

компилятор: g 5.3.0 с флагом —std=c 14

Ответ №1:

  • Почему следующий пример кода не создает двусмысленности

Это не ошибка. Тип параметра равен const int*amp; , это ссылка на неконстантный объект, который не может быть привязан к объекту с другим типом ( int* ). (Требуется неявное преобразование, и созданный временный файл не может быть привязан к ссылке на неконстантный.)

Если вы измените тип параметра на ссылку на const:

 void foo(const int* constamp;)
  

Или измените тип аргумента на const int* :

 const int* i=nullptr;
foo(i);
  

Оба приведут к ошибке компиляции при неоднозначном вызове.

  • Есть ли какой-либо способ вызвать вторую версию? (Если это не ошибка)

Вы можете сделать это с помощью указателя на функцию, явно указав, какой из них вы хотите получить:

 const int* i=nullptr;
static_cast<void(*)(const int*amp;)>(amp;foo)(i);
  

Комментарии:

1. О, вы правы. Кстати, могу ли я вызвать вторую версию?

2. И можете ли вы также сказать мне, почему для типа без указателя это создает двусмысленность?

3. @appleapple Смотрите мой отредактированный ответ. И что вы имели в виду, говоря о «типе без указателя»?

4. теперь я думаю, может быть, мой вопрос в том, почему T* не может быть приведен к const T*amp; , хотя.

5. @appleapple Рад, что смог помочь. Ну, о том, почему T* не может быть bount к const T*amp; , но нормально для const T* constamp; , я пытался объяснить в первом абзаце. Если это недостаточно ясно, пожалуйста, скажите мне. И ссылки ведут себя по-разному с указателями, это не одно и то же.