I have:
unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
The error: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’
What's the correct way to cast here in C++ style?
I have:
unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
The error: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’
What's the correct way to cast here in C++ style?
char * and const unsigned char * are considered unrelated types. So you want to use reinterpret_cast.
But if you were going from const unsigned char* to a non const type you'd need to use const_cast first. reinterpret_cast cannot cast away a const or volatile qualification.
Try reinterpret_cast
unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
You would need to use a reinterpret_cast<> as the two types you are casting between are unrelated to each other.
Too many comments to make to different answers, so I'll leave another answer here.
You can and should use reinterpret_cast<>, in your case
str.append(reinterpret_cast<const char*>(foo()));
because, while these two are different types, the 2014 standard, chapter 3.9.1 Fundamental types [basic.fundamental] says there is a relationship between them:
Plain
char,signed charandunsigned charare three distinct types, collectively called narrow character types. Achar, asigned char, and anunsigned charoccupy the same amount of storage and have the same alignment requirements (3.11); that is, they have the same object representation.
(selection is mine)
Here's an available link: https://en.cppreference.com/w/cpp/language/types#Character_types
Using wchar_t for Unicode/multibyte strings is outdated: Should I use wchar_t when using UTF-8?