Есть необходимость воспользоваться некоторой функцией. Например:
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 })
.
Но возможно лучше пойти по пути Передача массива в функцию не обьявляя его
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Я нашёл как передавать из qt в qml QAbstractListModelНо не нашёл как передать QMap
Столкнулся с проблемой написания конвертера из Python str в QString с использованием boostpython
Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»
Почему ring в виде восьмигранника оказывается не валиден: