#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;
, я пытался объяснить в первом абзаце. Если это недостаточно ясно, пожалуйста, скажите мне. И ссылки ведут себя по-разному с указателями, это не одно и то же.