Я маю:
unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
Помилка: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’
Який правильний спосіб перекласти тут у стилі C ++?
Я маю:
unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
Помилка: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’
Який правильний спосіб перекласти тут у стилі C ++?
Відповіді:
reinterpret_cast
basic formatting
.
char *
і const unsigned char *
вважаються непов’язаними типами. Отже, ви хочете використовувати reinterpret_cast
.
Але якщо ви переходили від const unsigned char*
нетипового const
типу, вам потрібно було б використовувати const_cast
спочатку. reinterpret_cast
не може відкинути const
або volatile
кваліфікацію.
char
, а signed char
та unsigned char
займають однаковий обсяг пам’яті і мають однакову вимогу до вирівнювання". Це Є стосунки. Або ось більш читабельне посилання: en.cppreference.com/w/cpp/language/types#Character_types
unsigned char * - це в основному байтовий масив і повинен використовуватися для представлення необроблених даних, а не рядка загалом. Рядок унікоду буде представлений як wchar_t *
Згідно зі стандартом C ++, повторне тлумачення_запису між непідписаними символами char * та char * є безпечним, оскільки вони мають однаковий розмір і мають однакову конструкцію та обмеження. Я намагаюся уникати reintrepret_cast навіть більше, ніж const_cast загалом.
Якщо статичний привід не вдається з тим, що ви робите, ви можете переглянути свій дизайн, бо, чесно кажучи, якщо ви використовуєте C ++, ви можете скористатися тим, що пропонує частина "плюс плюс", і використовувати рядкові класи та STL (він же std :: basic_string може працювати краще для вас)
Забагато коментарів для різних відповідей, тому я залишу тут іншу відповідь.
Ви можете і повинні використовувати reinterpret_cast<>
, у вашому випадку
str.append(reinterpret_cast<const char*>(foo()));
тому що, в той час як ці дві різні типи, стандарт 2014 року, глава 3.9.1 Fundamental types [basic.fundamental]
каже є відносини між ними:
Звичайна
char
,signed char
іunsigned char
три різних типи, собирательно звані вузькі типажі. Achar
, asigned char
таunsigned char
займають однаковий обсяг пам’яті та мають однакові вимоги до вирівнювання (3.11); тобто вони мають однакове представлення об’єкта.
(вибір мій)
Ось доступне посилання: https://en.cppreference.com/w/cpp/language/types#Character_types
Використання wchar_t
для Unicode / багатобайтових рядків застаріло: Чи слід використовувати wchar_t під час використання UTF-8?