String literals in C++ have type const char[] and are not allowed to be changed even if the implementation will not place them in a read-only memory.
Instead of pointers to string literals you can use character arrays. For example
1 2
char anna[] = "Anna";
char maria[] ="Maria";
But take into account if you want to append array maria to array anna then array anna shall have enough memory (size) to accept maria. As the size of maria is equal to 6 then anna shall have size equal to at least 10. So the definition of anna shall be
Casting a 'const T *' to 'T *' and the using the resulting pointer has undefined behavior. You really don't want to do that.
The destination string has to be non-const. There's no way around it.
What you could do is define your own concatenation function that returns a pointer to a dynamically allocated string, but if you're going that far you may as well just use std::string.