Why does this code return a warning
warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
if
A constexpr specifier used in an object declaration or non-static member function (until C++14) implies const. A constexpr specifier used in a function or static member variable (since C++17) declaration implies inline.
#include <cassert>
#include <string>
#include <iostream>
struct A
{
// warning: ISO C++ forbids converting a string constant to ‘char*’
static constexpr char* name_ = "A";
static constexpr char* name() { return name_; };
};
int main()
{};
If I add a const
after constexpr
, the warning is gone:
#include <cassert>
#include <string>
#include <iostream>
struct A
{
static constexpr const char* name_ = "A";
static constexpr const char* name() { return name_; };
};
int main()
{};
With g++ --version = g++ (GCC) 8.2.1 20181127
,
compilation g++ -O3 -std=c++2a -Wall main.cpp -o main
.
Does the constexpr
not imply const
on static
data members?
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.