string is always the default choice. I can't think of a realistic situation where a raw array of char would be an improvement, although, it's technically faster to create and destroy a function-local array than a default-allocated, sufficiently large, string object.
Now a string view/reference class can indeed be a good thing in real life.
Actually the best thing would be using string and cstring interchangeably. Cstrings have some decent string manipulation functions but string is safer and more practical to use. In some situations you would find it better to use one of these two, I find it particularly easy in string processing situations to stick with cstring, and I can easily convert back to the string.
If all you need is to reference a string literal, without manipulating its contents in any way, a pointer is sufficient (but do make it const char*, otherwise it's not a valid C++ program).