Есть необходимость воспользоваться некоторой функцией. Например:
void foo (int * arr) {
(void) arr;
}
Если вызывать её, скажем, так:
int arr [] = {1, 2};
foo (arr);
то компиляция проходит успешно. Если же написать подобный код:
foo ({1, 2});
то компилятор выдаст предупреждение error: cannot convert '<brace-enclosed initializer list>' to 'int*' for argument '1' to 'void foo(int*)'. Хотелось в подобном (foo ({1, 2})) синтаксисе вызывать функции от массивов, так как, говоря об области применения, хочется задать подобный массив через директиву #define и использовать, как константу.
Фактически, вы передаете в функцию временный массив.
В этом случае, вы можете объявить функцию. как шаблонную функцию следующего вида, как это показано в демонстрационной программе ниже.
#include <iostream>
#define List1 { 1 }
#define List2 { 1, 2 }
template <size_t N>
void f( const int ( &a )[N] )
{
for ( const auto &item : a ) std::cout << item << ' ';
std::cout << '\n';
}
int main( void )
{
f( List1 );
f( List2 );
}
Вывод на консоль:
1
1 2
{}-список в С++ сам по себе не является выражением, и в контексте инициализации указателя {}-список не будет расцениваться как инициализатор для массива. Сделать из него временный массив в таком контексте вы можете только явно
using A = int [];
A{ 1, 2 }
Получаем
void foo(int *arr)
{
}
int main()
{
using A = int [];
foo(A{ 1, 2 });
}
Замечание: баг в gcc может не позволить вам так неявно получить указатель на временный массив. Тогда foo((int *) A{ 1, 2 }).
Но возможно лучше пойти по пути Передача массива в функцию не обьявляя его
Продвижение своими сайтами как стратегия роста и независимости