Как вызвать функцию со ссылкой на неизвестный размер массива?

Рассмотрим действительный код:

template void by_numbered_reference(int (&array)[size]); 

Эта функция принимает массив как аргумент, и компилятор может вывести его размер с помощью вычитания аргумента шаблона.

Теперь это действительно (проверено на Apple clang версии 3.0), чтобы определить такую ​​функцию:

 void by_reference(int (&array)[], int size); 

Какой (должен) принять ссылку на неизвестный размер массива в качестве аргумента. Отмечая, что int[] и int[n] являются различными типами и обычно несовместимы.

Единственный способ, которым я нашел, как вызвать эту функцию:

 int * array; by_reference(reinterpret_cast(*array), array_size); 
  1. Почему язык принимает ссылку на неизвестный размер массива как допустимый аргумент функции, хотя нет простого способа определить такую ​​переменную?
  2. Существуют ли какие-либо известные варианты использования, где требуется этот синтаксис?
  3. Почему void by_reference(int (*&array), int size) не следует использовать вместо этого?

Ваше предположение неверно, программа плохо сформирована. См. Стандарт C ++ 11 8.3.5 / 8:

Если тип параметра включает тип формы «указатель на массив неизвестной границы T» или «ссылка на массив неизвестной границы T», программа плохо сформирована.

clang позволяет это как расширение компилятора. g ++, например, не примет его.

Однако вы можете использовать шаблоны для вывода размера переданного массива:

 template  void by_reference(int (&)[N]) { // whatever }