Теперь, когда у нас есть std::array
, std::vector
и инициализация скобки, нужны ли массивы C-стиля?Насколько жизнеспособны альтернативы массивам C-стиля?
ответ
Одна вещь, что массивы C-стиля все еще хранятся над std::array
: размер вычета. Вы можете выполнить следующие действия с массивами C-стиле, but not really with 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
-access для элементов, поэтому вы не можете их мутировать.
Но предостережение: std::initializer_list
s имеет ссылочную семантику, и если они возвращены из функции, у вас будет болтающаяся ссылка на какое-либо хранилище.
В конце концов, я бы сказал, что в некоторых узких ситуациях и нишах все еще есть место для массивов С-стиля, но в общем случае у нас есть лучшие варианты, доступные сейчас с std::array
и std::initializer_list
.
Спасибо, хороший ответ! поэтому, если я правильно понимаю, когда во время компиляции можно будет запрашивать размер 'initializer_list', даже это преимущество исчезнет? Я думаю, вы можете затем создать функцию шаблона, чтобы вернуть std :: array и вычесть размер, не так ли? – JohnnyW
Нет, они не являются. –
@ AndyProwl Вы могли бы уточнить: какие возможные варианты использования? – JohnnyW
@JohnnyW: Что вы думаете о 'std :: array'? –