On Mon, Feb 17, 2025 at 3:09 PM Vladimir Grigoriev via Std-Discussion <std-discussion@lists.isocpp.org> wrote:
In p. 5 of the section 6.2 Declarations and definitions of the C++23 Standard there is written
 
5 In the definition of an object, the type of that object shall not be an incomplete type (6.8), an abstract class type (11.7.4), or a (possibly multi-dimensional) array thereof
 
Also in p.5 of the sub-section 6.8.1 General of the section 6.8 Types there is written
 
...The type of a pointer to array of unknown bound, or of a type defined by a typedef declaration to be an array of unknown bound, cannot be completed.
 
And further there is followed an example (Example 3)
 
    class X;             // X is an incomplete type
    extern X* xp;         // xp is a pointer to an incomplete type
    extern int arr[];         // the type of arr is incomplete
    typedef int UNKA[];     // UNKA is an incomplete type
    UNKA* arrp;         // arrp is a pointer to an incomplete type
    UNKA** arrpp;
 
But according to the first provided quote this object definition
 
    UNKA* arrp;         // arrp is a pointer to an incomplete type
 
is invalid because such a pointer has an incomplete type.

All pointer types are complete. What the standard means to say, but uses imprecise language to describe, is that `UNKA*` is a distinct type from `A*` where `A` is any array of known bound. This stands in contrast to the case of `X*`, which will be the same as the type `X*` later on when `X` is complete.
 
 
So it looks like the example does not make sense or do I have missed something?
 
With best regards
(Vlad from Moscow)
--
Std-Discussion mailing list
Std-Discussion@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/std-discussion


--
Brian Bi