Разрешение перегрузки C++, определяемое пользователем преобразование и шаблон функции
С g++ 3.4 и 4.7 я наблюдал следующее странное поведение:
Шаблон функции не соответствует, если необходимо пользовательское преобразование, где обычная функция будет. Я не смог найти соответствующее правило в стандарте C++98. Является ли g++ правильным (как я предполагаю)? Или это ошибка?
template <class T>
int x(auto_ptr_ref<T> p)
{
return 1;
}
// this would match
/*
int x(auto_ptr_ref<int> p)
{
return 2;
}
*/
void dummy()
{
cout << x(auto_ptr<int>()) << endl;
}
1 ответ:
GCC корректен, дедукция аргументов шаблона не учитывает неявные преобразования.
Вычет типа не учитывает неявные преобразования (кроме приведенных выше корректировок типа): это задание для разрешения перегрузки, которое происходит позже.
Для вашего кода
auto_ptr_ref
не совпадает сauto_ptr
, вывод параметра шаблонаT
не выполняется, поэтому шаблон функцииx()
вообще не будет рассматриваться для разрешения перегрузки.