Разрешение перегрузки 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 6

1 ответ:

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

Вычет типа не учитывает неявные преобразования (кроме приведенных выше корректировок типа): это задание для разрешения перегрузки, которое происходит позже.

Для вашего кода auto_ptr_ref не совпадает с auto_ptr, вывод параметра шаблона T не выполняется, поэтому шаблон функции x() вообще не будет рассматриваться для разрешения перегрузки.