Warning: ISO C++ forbids converting a string constant to ‘char*’ for a static `constexpr char*` data member

constexpr does imply const, but in this case it applies const to the "wrong thing".

constexpr char*

is basically the same as

char * const

which is a constant pointer to a non-const char. This won't work because string literals have the type const char[N] so it would cast away the constness of the array elements.

constexpr const char*

on the other hand, is basically the same as

char const * const

which is a constant pointer to a constant char, which is what you want as it preserves the constness of the elements.


There is a usual difference between a constant pointer and a pointer to constant. By making your constexpr char* you made a pointer itself a constexpr (and, of course, const), but it still attempts to point at non-const character - and this is wrong, as string literals are const. Solution:

constexpr const char* ch = "StackOverflow!";

Which declares a constexpr pointer to const.