Date: Tue, 18 Feb 2025 00:16:26 +0300
On 2/17/25 23:09, Vladimir Grigoriev via Std-Discussion 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.
>
> So it looks like the example does not make sense or do I have missed
> something?
I'm not sure which version of the standard you're reading, but the
current wording is different. I'm guessing you're referring to Note 2 in
paragraph 6:
http://eel.is/c++draft/basic.types.general#6
<quote>
The type of a pointer or reference to array of unknown bound permanently
points to or refers to an incomplete type.
An array of unknown bound named by a typedef declaration permanently
refers to an incomplete type.
In either case, the array type cannot be completed.
</quote>
Note the text refers to the *array* type, not the *pointer* type. The
pointer type itself is always complete, even if the pointee type is
incomplete.
> 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.
>
> So it looks like the example does not make sense or do I have missed
> something?
I'm not sure which version of the standard you're reading, but the
current wording is different. I'm guessing you're referring to Note 2 in
paragraph 6:
http://eel.is/c++draft/basic.types.general#6
<quote>
The type of a pointer or reference to array of unknown bound permanently
points to or refers to an incomplete type.
An array of unknown bound named by a typedef declaration permanently
refers to an incomplete type.
In either case, the array type cannot be completed.
</quote>
Note the text refers to the *array* type, not the *pointer* type. The
pointer type itself is always complete, even if the pointee type is
incomplete.
Received on 2025-02-17 21:16:29