Массивы - граждане второго сорта в C ++.
Они являются объектами,
но они строго ограничены
они не могут быть скопированы,
они разлагаются на указатели в разных контекстах и т. д.
Рассмотрите возможность использования std::array
,
которая является оболочкой (фиксированного размера) поверх встроенных массивов,
но это первоклассный гражданин, который поддерживает различные удобства:
std::array<int, 3> my_array = {10, 20, 30};
my_array = {40, 50, 60};
Это работает, потому что для [array.overview] / 2 ,
std::array
- это агрегатный тип, который можно инициализировать списком с помощью
в N
элементы, типы которых могут быть преобразованы в T
.
живая демоверсия
Это также работает с std::vector
.
Векторы это другая история,
поэтому я не буду вдаваться в подробности.
Если вы предпочитаете настаивать на встроенных массивах,
вот обходной путь, который я разработал, чтобы включить
присваивание списка значений встроенному массиву
(уважая ценностные категории),
используя методы метапрограммирования шаблонов.
Ошибка времени компиляции (правильно) возникает
если длина массива и список значений не совпадают.
(Благодаря Caleth
комментарий для указания на это!)
Обратите внимание, что копирование встроенных массивов невозможно в C ++;
вот почему мы должны передать массив в функцию.
namespace detail {
template <typename T, std::size_t N, std::size_t... Ints, typename... Args>
void assign_helper(T (&arr)[N], std::index_sequence<Ints...>, Args&&... args)
{
((arr[Ints] = args), ...);
}
}
template <typename T, std::size_t N, typename... Args>
void assign(T (&arr)[N], Args&&... args)
{
return detail::assign_helper(arr, std::make_index_sequence<N>{}, std::forward<Args>(args)...);
}
и использовать его:
int arr[3] = {10, 20, 30};
assign(arr, 40, 50, 60);
Теперь arr
состоит из 40, 50, 60
.
живое демо