6

С г ++ 3.4 и 4.7 я заметил следующее странное поведение:C++ Разрешение перегрузки, определяемый пользователь преобразование и шаблон функции

Шаблон функции не соответствует, если определенному пользователю преобразование необходимо, где обычная функция будет. Я не смог найти соответствующее правило в стандарте 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; 
} 

ответ

7

GCC является правильным, template argument deduction не учитывает неявные преобразования.

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

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

Смежные вопросы