Теперь, когда у нас есть std::array
, std::vector
и инициализация скобки, все еще нужны массивы в стиле C?
Одна вещь, которую до сих пор сохраняют массивы в стиле C std::array
является размер вычета. Вы можете сделать следующее с массивами в стиле C, но не совсем с std::array
:
int arr[] = {1,2,3,4,5}; // no explicit size
Теперь у нас также есть другой кандидат на замену массивов в стиле C: std::initializer_list
, Внутренне он поддерживается неким массивом хранилищ, но обратите внимание:
#include <initializer_list> // needed
// ...
auto list = {1,2,3,4,5}; // no explicit size, and no explicit type!
А также decltype(list) == std::initializer_list<int>
, Тем не менее, в настоящее время вы не можете запросить размер или элементы такого std::initializer_list
во время компиляции, так как функции-члены не помечены constexpr
(пока что исправлено в C ++ 14). Кроме того, еще большая проблема: std::initializer_list
только обеспечивает const
-доступ к элементам, так что вы не можете изменить их.
Но осторожность: std::initializer_list
с семантика ссылок и если они возвращаются из функции, у вас будет свисающая ссылка на какое-то хранилище.
В конце я бы сказал, что в некоторых узких ситуациях и нишах еще есть место для массивов в стиле C, но в общем случае у нас теперь есть лучшие варианты с std::array
а также std::initializer_list
,
Других решений пока нет …