Попробуйте:
fun((int[3]){1,2,3});
fun((int[5]){});
Что касается "бонусных баллов": массивы переменного размера не являются частью языка.Это расширение языка не работает с аргументами шаблона:
prog.cc: 4: 6: примечание: шаблон кандидата игнорируется: ошибка замещения: переменно измененный тип 'int [n]' не может использоватьсяв качестве аргумента шаблона fun (const T & t)
Edit
Как отметил Крис, в приведенном выше решении предлагается использовать составные литералы , которые являются расширением C ++,Существует решение, позволяющее избежать этого расширения в C ++ с использованием простого вспомогательного класса:
template <class T, std::size_t N>
struct my_array
{
T data[N];
};
template <class T, std::size_t N>
void print(const T (&x)[N])
{
for (auto i: x)
std::cout << i << '\n';
}
int main()
{
print(my_array<int,3>{9,10,11}.data);
}
Это работает хорошо, но требует добавления аргумента шаблона в my_array, который не выводится.С C ++ 17 возможно автоматически определить тип и размер:
template <class T, std::size_t N>
struct my_array
{
constexpr my_array(std::initializer_list<T> x)
{
std::size_t i = 0;
for (auto val : x)
data[i++] = val;
}
T data[N];
};
template <class ...T>
my_array(T...) -> my_array<typename std::common_type<T...>::type, sizeof...(T)>;
int main()
{
print(my_array{9,10,11}.data);
}
Для двумерных массивов это немного сложнее:
template <class T, std::size_t N1, std::size_t N2>
struct my_array2d
{
constexpr my_array2d(std::initializer_list<std::initializer_list<T> > x)
{
std::size_t i = 0;
for (const auto & row : x) {
int j=0;
for (const auto & val: row) {
data[i][j++] = val;
}
i++;
}
}
T data[N1][N2];
};
int main()
{
work(my_array2d<int, 3, 2>{{9,1},{10,2},{11,3}}.data);
}
Я отказался от руководств по выводамдля двумерных массивов, но я верю, что они возможны.