Partial ordering of function templates и ссылки на массив
От: tcoder  
Дата: 15.10.07 11:56
Оценка:
Видел в почтовой рассылке Boost-а пример ошибки в Sun C++. В следующем коде этот компилятор выдает ambiguity error — не может выбрать правильный вариант функции. G++, Visual C++, Comeau компилируют нормально.
template <typename T1>
void foo(T1 const & t);

template <typename T2, unsigned N>
void foo(T2 ( & t ) [N]) {}

int main()
{
    foo("test");
}

Казалось бы все логично. В соответствии с 14.5.5.2 второй вариант foo более специализированный. Из T2(&)[N] можно вывести T1 в T1 const&. А вот из T1 const& вывести T2 и N в T2(&)[N] нельзя.

Но вот что мне непонятно. В следующем примере все компиляторы выбирают вторую функцию. Хотя при определении более специализированной функции можно вывести и T2 при подстановке T1& в T2 const& и T2 при подстановке T2 const& в T1&. Прав ли я, что здесь вступает в силу правило из 14.5.5.2/4 о том что типы должны быть exact match (т.е. T1& в T2 const& не проходит)? А если прав, почему это же правило не зарубает подстановку T2(&)[N] в T1 const& из первого примера?
template <typename T1>
void foo(T1 & t);

template <typename T2>
void foo(T2 const & t) {}

int main()
{
    foo("test");
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.