Массив не может быть аргументом функции.
Кроме того, ссылка int
не может привязываться к массиву int
. Также нельзя использовать целочисленную ссылку как массив.
Тем не менее, указатель может быть доступен с помощью оператора индекса почти так же, как массив. Имя массива фактически неявно преобразуется в указатель на первый элемент. Это преобразование называется распадающимся:
int array[n];
int* ptr_to_first_element = array;
assert(ptr_to_first_element[i] == array[i]);
Таким образом, вы можете использовать целочисленный указатель в качестве аргумента функции и передать указатель на первый элемент массива:
void foo(int *array, std::size_t size);
// ...
int array[n];
foo(array, n);
Все вышесказанное относится и к лямбдам. Чтобы вы могли написать:
auto print_array = [](int *array, int i) -> int {
// ^ notice this
//print out array using the pointer
return 0;
}(&actual_array, actual_i);
Вы можете однако иметь ссылку на массив определенного размера в качестве аргумента функции:
void foo(int (&array)[20]);
Это немного ограничивает, поскольку ссылка может связываться только с массивом одного определенного размера. Шаблон упрощает создание такой функции для любого размера массива:
template<std::size_t size>
void foo(int (&array)[size]);
Полиморфные лямбды (введенные в C ++ 14) значительно упрощают это:
int actual_array[10];
auto print_array = [](auto &array, int i) -> int {
// ^^^^^^ notice this
//print out the referred array
return 0;
}(&actual_array, actual_i);
В этом случае тип аргумента array
будет выводиться как int (&)[10]
.
P.S. «распечатка» массива звучит как то, что не нужно модифицировать массив. Учтите это и, если возможно, используйте const
указатель на первый элемент или const
ссылку в качестве аргумента.
Обратите внимание, что оболочка std::array
является классом, а не массивом. Таким образом, std::wrapper
не неявно затухает до указателя, и std::array
может использоваться в качестве аргумента функции, если это необходимо.