Да, он является смежным, поскольку в основном (и фактически) является type arr[10];
, но с STL-подобным интерфейсом. Также не затухает указатель на малейшую провокацию.
Вы можете безопасно передать &arr[0]
функции, ожидающей массив в стиле C, и это является целью его разработки. Однако, чтобы использовать его с алгоритмами STL, просто используйте функции begin
и end
:
// either members
std::sort(arr.begin(), arr.end());
// or free from <iterator>
std::sort(std::begin(arr), std::end(arr));
Для адвоката по языку, §23.3.2.1 [array.overview] p1
:
Заголовок <array>
определяет шаблон класса для хранения последовательностей объектов фиксированного размера. Массив поддерживает итераторы произвольного доступа. Экземпляр array<T, N>
хранит N
элементов типа T
, так что size() == N
является инвариантом. Элементы array
хранятся непрерывно , что означает, что если a
является array<T, N>
, то оно подчиняется идентификатору &a[n] == &a[0] + n
для всех 0 <= n < N
.
И §23.3.2.1 [array.overview] p2
:
Массив - это агрегат (8.5.1), который можно инициализировать с помощью синтаксиса
array<T, N> a = {
список инициализаторов };
Кроме того, в p3
перечислены члены std::array
:
T elems[N]; // exposition only
[ Примечание: Переменная-член elems
показана только для экспозиции, чтобы подчеркнуть, что array
является агрегатным классом. Имя elems
не является частью интерфейса array
. - конец примечания ]