V>Опять, я не спрашиваю почему происходит неоднозначность, я спрашиваю почему она должна происходить, улавливаешь разницу?
Так как в противном случае нарушалась бы семантика вызова в зависимости от контекста.
Имеем
void test(const char(&)[5]) // (1)
{
// do something
}
void test(const char*) // (2)
{
// do something different
}
Допустим, что обе функции не равнозначны с точки зрения перегрузки для массива из 5 элементов, т.е. первая предпочтительнее т.к. не требует array-to-pointer conversion.
test("test"); // "test" - это array of 5 const char, вызывается (1).
const char* name = "test";
test(name); // name - это pointer to const char, вызывается (2).
Получаем опасную неоднозначность вызова.