wctrans_t and wctype_t as nullptr_tAuthors: Jay Ghiron
Date: 2026-03-24
Submitted against: C23
Status: Open
No wording exists currently to say that wctrans_t and wctype_t cannot
be defined as nullptr_t:
The types declared are
wint_tdescribed in 7.31.1;
wctrans_twhich is a scalar type that can hold values which represent locale-specific character mappings; and
wctype_twhich is a scalar type that can hold values which represent locale-specific character classifications.
(C23 7.32.1 "Introduction" paragraph 2.)
Before C23 nullptr_t did not exist as a scalar type so wctrans_t
and wctype_t could not be defined as nullptr_t, but in C23
nullptr_t was added as a scalar type which is what wctrans_t and
wctype_t are defined in terms of. An example of where this matters
is:
#include<wctype.h>
int main(){
bool b=true;
wctrans_t t=b?wctrans("example"):0;
}
If wctrans_t were defined as nullptr_t, then this program would have a
constraint violation:
One of the following shall hold for the second and third operands:
- both operands have arithmetic type;
- both operands have compatible structure or union type;
- both operands have void type;
- both operands are pointers to qualified or unqualified versions of compatible types;
- both operands have
nullptr_ttype;- one operand is a pointer and the other is a null pointer constant or has type
nullptr_t; or- one operand is a pointer to an object type and the other is a pointer to a qualified or unqualified version of
void.
(C23 6.5.16 "Conditional operator" paragraph 3.)
There seems to be no reason to allow for wctrans_t or wctype_t to
be defined as nullptr_t. Such definitions would also not be
sufficient to include all of the standard categories which are
defined. The same is also true for bool, bit-precise integer types
with a small width, and extended integer types with a small width.
Modify C23 7.32.1 paragraph 2:
wctrans_twhich is a scalar type that can hold at least two nonzero values which represent locale-specific character mappings; and
wctype_twhich is a scalar type that can hold at least twelve nonzero values which represent locale-specific character classifications.
Note: Zero is already used to mean null for pointer types, though that is never clearly defined.