2013-06-18 2 views
3

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

+1

Нет, они не являются. –

+0

@ AndyProwl Вы могли бы уточнить: какие возможные варианты использования? – JohnnyW

+1

@JohnnyW: Что вы думаете о 'std :: array'? –

ответ

12

Одна вещь, что массивы 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.

+0

Спасибо, хороший ответ! поэтому, если я правильно понимаю, когда во время компиляции можно будет запрашивать размер 'initializer_list', даже это преимущество исчезнет? Я думаю, вы можете затем создать функцию шаблона, чтобы вернуть std :: array и вычесть размер, не так ли? – JohnnyW

Смежные вопросы