web-dev-qa-db-ja.com

unsigned char *から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++スタイルでキャストする正しい方法は何ですか?

75
jackhab

reinterpret_cast

45
Ruben Bartelink

char *およびconst unsigned char *は無関係なタイプと見なされます。したがって、reinterpret_cast

ただし、const unsigned char*を使用する必要のあるconstタイプ以外const_cast 最初。 reinterpret_castは、constまたはvolatile資格を捨てることはできません。

56
Brian R. Bondy

reinterpret_cast

unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
50
JaredPar

unsigned char *は基本的にバイト配列であり、一般に文字列ではなく生データを表すために使用する必要があります。 Unicode文字列はwchar_t *として表されます

C++標準によると、unsigned char *とchar *の間のreinterpret_castは同じサイズであり、同じ構造と制約を持っているため安全です。一般的にconst_castよりもreintrepret_castを避けるようにします。

C++を使用している場合は、「プラスプラス」部分が提供するものを利用して、文字列クラスとSTL(別名std :: basic_string)を使用することができます。あなたのためにうまくいくかもしれません)

17
AJG

キャストしている2つのタイプは互いに無関係なので、reinterpret_cast<>を使用する必要があります。

6
Timo Geusch

コメントが多すぎて異なる回答にできないため、ここに別の回答を残します。

あなたの場合、reinterpret_cast<>を使用できますし、使用すべきです

str.append(reinterpret_cast<const char*>(foo()));

なぜなら、これら2つは異なるタイプですが、2014標準では、3.9.1 Fundamental types [basic.fundamental]の章にとあります関係があります:

プレーンcharsigned charおよびunsigned charは3つの異なるタイプであり、ナロー文字タイプと総称されます。 A charsigned char、およびunsigned charは同じ量のストレージを占有し、同じアライメント要件(3.11)を持ちます。つまり、それらは同じオブジェクト表現を持ちます。

(選択は私のものです)

利用可能なリンクは次のとおりです。 https://en.cppreference.com/w/cpp/language/types#Character_types

Unicode /マルチバイト文字列にwchar_tを使用するのは時代遅れです: TF-8を使用する場合はwchar_tを使用すべきですか?

3