Ответ 1
Да, он смежный, поскольку он в основном (и фактически) a 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
s. -end note]