C++ Logo

std-proposals

Advanced search

Re: [std-proposals] Only reason I don't use std::array

From: Timur Doumler <cpp_at_[hidden]>
Date: Thu, 17 Aug 2023 14:25:22 +0300
Hi Ville,

> On 17 Aug 2023, at 14:15, Ville Voutilainen <ville.voutilainen_at_[hidden]> wrote:
>
> On Thu, 17 Aug 2023 at 13:50, Timur Doumler via Std-Proposals
> <std-proposals_at_[hidden]> 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 <http://eel.is/c++draft/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

Received on 2023-08-17 11:25:25