T>Видел в почтовой рассылке Boost-а пример ошибки в Sun C++. В следующем коде этот компилятор выдает ambiguity error — не может выбрать правильный вариант функции. G++, Visual C++, Comeau компилируют нормально.
T>T>template <typename T1>
T>void foo(T1 const & t);
T>template <typename T2, unsigned N>
T>void foo(T2 ( & t ) [N]) {}
T>int main()
T>{
T> foo("test");
T>}
T>
T>Казалось бы все логично. В соответствии с 14.5.5.2 второй вариант foo более специализированный. Из T2(&)[N] можно вывести T1 в T1 const&. А вот из T1 const& вывести T2 и N в T2(&)[N] нельзя.
T>Но вот что мне непонятно. В следующем примере все компиляторы выбирают вторую функцию. Хотя при определении более специализированной функции можно вывести и T2 при подстановке T1& в T2 const& и T2 при подстановке T2 const& в T1&. Прав ли я, что здесь вступает в силу правило из 14.5.5.2/4 о том что типы должны быть exact match (т.е. T1& в T2 const& не проходит)? А если прав, почему это же правило не зарубает подстановку T2(&)[N] в T1 const& из первого примера?
T>T>template <typename T1>
T>void foo(T1 & t);
T>template <typename T2>
T>void foo(T2 const & t) {}
T>int main()
T>{
T> foo("test");
T>}
T>
Всем спасибо

, допер сам. В драфте нового стандарта эта тема освещена более подробно. CV-квалификаторы типов сравниваются только в том случае, если обе функции эквивалентны с точки зрения "partial ordering". Во втором примере это так, но второй вариант имеет const и мы выбираем его. В первом варианте вывод в одну сторону не срабатывает, поэтому и квалификаторы можно не сравнивать.