Насколько жизнеспособны альтернативы массивам в стиле C?

Теперь, когда у нас есть std::array, std::vector и инициализация скобки, все еще нужны массивы в стиле C?

3

Решение

Одна вещь, которую до сих пор сохраняют массивы в стиле 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,

12

Другие решения

Других решений пока нет …