C-массивы несколько сложно понять синтаксически на С++ и могут немного привыкнуть. Хотя 1D-массив распадается на указатель:
void fn1(int x[2]) {}
void fn2(int*x) {}
fn1()
и fn2()
имеют одну и ту же сигнатуру функции.
У массива действительно есть тип, который включает в себя количество элементов в массиве. Как в:
void fn(int (&)[2]) {}
fn()
будет принимать только 2-элементный массив int.
Thing is, я могу только видеть, что массив фиксированного числа элементов может генерироваться только стекю, областью файлов или распределением структуры/класса с этой сигнатурой:
int twoElementArray[2];
Если бы я динамически выделял его в куче, я не мог бы получить одну и ту же подпись. Я думал, что смогу его бросить, но безуспешно:
int (&array)[2] = reinterpret_cast<int(&)[2]>(new int[2]); // FAIL!
Любые идеи относительно того, как это может быть выполнено, если вообще?
РЕДАКТИРОВАТЬ:. Хотя я выбрал ответ, он на самом деле ничего не делает, но использует определенно лучший метод, чем литье (лучше не бросать, если не требуется ИМО). Тем не менее, это технически не отвечает на вопрос, так как вопрос спрашивает, существует ли способ для указания указателя на тип массива? Ответ - да.
int (&array)[2] = *reinterpret_cast<int(*)[2]>(new int[2]); // SUCCESS!
Заметьте, что я не обязательно рекомендую это делать, но он отвечает на вопрос. Если бы мне нужно было преобразовать указатель в тип массива, это было бы так, как это сделать. Прочтите выбранный ответ для лучшего решения при использовании operator new[]
.