私は持っています:
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
char *
およびconst unsigned char *
は無関係なタイプと見なされます。したがって、reinterpret_cast
。
ただし、const unsigned char*
を使用する必要のあるconst
タイプ以外const_cast
最初。 reinterpret_cast
は、const
またはvolatile
資格を捨てることはできません。
reinterpret_cast
unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
unsigned char *は基本的にバイト配列であり、一般に文字列ではなく生データを表すために使用する必要があります。 Unicode文字列はwchar_t *として表されます
C++標準によると、unsigned char *とchar *の間のreinterpret_castは同じサイズであり、同じ構造と制約を持っているため安全です。一般的にconst_castよりもreintrepret_castを避けるようにします。
C++を使用している場合は、「プラスプラス」部分が提供するものを利用して、文字列クラスとSTL(別名std :: basic_string)を使用することができます。あなたのためにうまくいくかもしれません)
キャストしている2つのタイプは互いに無関係なので、reinterpret_cast<>
を使用する必要があります。
コメントが多すぎて異なる回答にできないため、ここに別の回答を残します。
あなたの場合、reinterpret_cast<>
を使用できますし、使用すべきです
str.append(reinterpret_cast<const char*>(foo()));
なぜなら、これら2つは異なるタイプですが、2014標準では、3.9.1 Fundamental types [basic.fundamental]
の章にとあります関係があります:
プレーン
char
、signed char
およびunsigned char
は3つの異なるタイプであり、ナロー文字タイプと総称されます。 Achar
、signed char
、およびunsigned char
は同じ量のストレージを占有し、同じアライメント要件(3.11)を持ちます。つまり、それらは同じオブジェクト表現を持ちます。
(選択は私のものです)
利用可能なリンクは次のとおりです。 https://en.cppreference.com/w/cpp/language/types#Character_types
Unicode /マルチバイト文字列にwchar_t
を使用するのは時代遅れです: TF-8を使用する場合はwchar_tを使用すべきですか?