Я пытаюсь создать набор перегруженных шаблонов для массивов/указателей, где один шаблон будет использоваться, когда компилятор знает размер массива, а другой шаблон будет использоваться, т:могут ли эти шаблоны быть однозначными
template <typename T, size_t SZ>
void moo(T (&arr)[SZ])
{ ... }
template <typename T>
void moo(T *ptr)
{ ... }
проблема заключается в том, что, когда компилятор знает размер массива, то перегруженные неоднозначны и компиляция терпит неудачу.
Есть ли способ устранить двусмысленность (возможно, через SFINAE), или это просто невозможно.
Если не вторая перегрузка имеет 'size_t' параметра или что-то, так что функция будет знать размер массива, на который указывает 'ptr'? –
Версия указателя необязательно должна быть для динамических массивов. @ins –
Хороший вопрос, я наткнулся на ту же самую проблему. Для записи двусмысленность возникает из-за того, что преобразование матрицы в указатель считается точным совпадением во время разрешения перегрузки (§13.3.3.1.1). Я не считаю это очень интуитивным поведением, и мне было бы интересно узнать, почему такое решение было принято. –