This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of WP status.

4037. Static data members of ctype_base are not yet required to be usable in constant expressions

Section: 28.3.4.2.1 [category.ctype.general] Status: WP Submitter: Jiang An Opened: 2024-01-12 Last modified: 2024-04-02

Priority: Not Prioritized

View all issues with WP status.

Discussion:

It may be desired that static data members ctype_base are "real constants", i.e. usable in constant expressions. However, this is not strictly required because mask is only required to be a bitmask type that can be a class type, which makes the plain const potentially insufficient.

[2024-03-12; Reflector poll]

Set status to Tentatively Ready after five votes in favour during reflector poll.

[Tokyo 2024-03-23; Status changed: Voting → WP.]

Proposed resolution:

This wording is relative to N4971.

  1. Modify 28.3.4.2.1 [category.ctype.general] as indicated:

    namespace std {
      class ctype_base {
      public:
        using mask = see below;
    
        // numeric values are for exposition only.
        static constexpr mask space  = 1 << 0;
        static constexpr mask print  = 1 << 1;
        static constexpr mask cntrl  = 1 << 2;
        static constexpr mask upper  = 1 << 3;
        static constexpr mask lower  = 1 << 4;
        static constexpr mask alpha  = 1 << 5;
        static constexpr mask digit  = 1 << 6;
        static constexpr mask punct  = 1 << 7;
        static constexpr mask xdigit = 1 << 8;
        static constexpr mask blank  = 1 << 9;
        static constexpr mask alnum  = alpha | digit;
        static constexpr mask graph  = alnum | punct;
      };
    }
    

    -1- The type mask is a bitmask type (16.3.3.3.3 [bitmask.types]).