Hi Ville,

On 17 Aug 2023, at 14:15, Ville Voutilainen <ville.voutilainen@gmail.com> wrote:

On Thu, 17 Aug 2023 at 13:50, Timur Doumler via Std-Proposals
<std-proposals@lists.isocpp.org> wrote:

std::array provides some guarantees: that the N elements of type T are contiguous, that std::array is an aggregate (with further guarantees on how you can initialise it), that it is a structural type, etc.

AFAIK it does however does *not* provide a guarantee that there is an actual array, that is, a T[N], under the hood anywhere. A hostile implementation could implement std::array<T, 2> for example as a struct { T first, second; };

No, it can't. That implementation wouldn't fulfill the requirements of
array::data(), which are that
[data(), data() + size())
is a valid range (and that range is denoted by pointer arithmetic, and
traversed by pointer arithmetic,
because data() and data()+size() are just pointers).

The implementation can fulfil this requirement by fiat – because the compiler makes it so. std::complex has this property, too – although it's specified differently (see [complex.numbers.general]/4), the effect is the same, you can use pointer arithmetic here, because the Standard says that you can. None of this guarantees that there is an actual T[N] anywhere under the hood, certainly not for std::array as far as I can see.

Cheers,
Timur