Мой вопрос касается этого очень простого и короткого кода, в котором производится попытка перегрузки между двумя функциями без шаблона, принимающими параметр ссылки на массив. Вопрос был опубликован в другом месте, но в контексте шаблона вывода. Здесь код:
#include <iostream>
void foo ( const int (&x) [3] ) { std::cout << "3\n"; }
void foo ( const int (&x) [2] ) { std::cout << "2\n"; }
int main()
{
foo({1,2,3});
}
g++ 4.8.3 компилирует этот код, выбирая первую функцию как (я полагаю) ТОЛЬКО жизнеспособную, в то время как clang 3.4 не компилирует его, говоря, что вызов foo неоднозначен (почему?).
Какой компилятор делает правильные вещи?
clang не компилирует код, даже удаляя вторую перегрузку: кажется, что initializer_list просто не принят для инициализации ссылки массива.
Является ли это ошибкой?