A value of type "const char*" cannot be used to initialize an entity of type "char *"
That is correct. Let’s say you had the following code:
const char hello[] = "hello, world!";
char* jello = hello; // Not allowed, because:
jello[0] = 'J'; // Undefined behavior!
Whoops! A const char*
is a non-const pointer to const char
. If you assign its value to a non-const char*
, you’ve lost its const
property.
A const
pointer to non-const char
would be a char* const
, and you can initialize a char*
from that all day if you want.
You can, if you really want, achieve this with const_cast<char*>(p)
, and I occasionally have, but it’s usually a sign of a serious design flaw. If you actually get the compiler to emit instructions to write to the memory aliased by a string constant, you get undefined behavior. One of the many things that might go wrong is that some implementations will store the constant in read-only memory and crash. Or the same bytes of memory might be re-used for more than one purpose, because after all, we warned you never to change it.
By the way, the rules in C are different. This is solely for backward-compatibility with early versions of C that did not have the const
keyword, and you should never write new code that uses a non-const alias to a string constant.
You need to make your string literal type const
because in C++ it is a constant array of char
, unlike C where it is just an array of char
. You cannot change a string literal, so making it const
is preferred in C++ for extra safety. It is the same reason you have to use an explicit cast when going from const char*
to char*
. It's still technically "allowed" in C++ since it is allowed in C, which is why it's just a warning. It's still bad practice to do so. To fix the warning, make it const
.
const char* sandwich = "ham";