I feel like that particular point is more about the fact that new T[0] treats the size as a runtime argument, hence the requirement that T be default constructible, even if the default constructor isn't run. I feel like we don't need to apply that logic to std::array, since we know the size at compile time.

On Fri, Dec 8, 2023 at 1:04 PM Jens Maurer <jens.maurer@gmx.net> wrote:


On 08/12/2023 00.27, Arthur O'Dwyer wrote:
> On Thu, Dec 7, 2023 at 2:00 AM Jens Maurer <jens.maurer@gmx.net <mailto:jens.maurer@gmx.net>> wrote:

>     A consistency point of view:
>     T * p = new T[n];
>     (where n might be a constant or not)
>     is now required to have T default constructible even if n = 0. CWG 2102 <https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2102>.
>
>
> That's a different (and perhaps even deeper) can of worms, right?

Sure, but it's also about empty arrays.

Jens


> We currently lack specification for whether any of these expressions are supposed to work:
>   std::array<const int, 0> ca = {}; // OK
>   std::array<const int, 0> cb; // unclear; libc++ and *Microsoft* reject; *libstdc++* accepts
>   ca = ca; // unclear; libc++ and Microsoft reject; libstdc++ accepts
>   ca.fill(42);  // unclear; libc++ and *libstdc++* reject; *Microsoft* accepts
>   ca.swap(ca);  // unclear; libc++ and libstdc++ reject; Microsoft accepts
> Is there yet an LWG issue to clarify the well-formedness of the "mutating" member functions of array<const T, N>?
>
> Thanks,
> Arthur