CPPリファレンス documentation では、
char
に気づきました
文字タイプは、UTF-8 8ビットコードユニットを表すのに十分な大きさ(C++ 14以降)
とchar8_t
uTF-8文字表現のタイプ。UTF-8コード単位(8ビット)を表すのに十分な大きさが必要
それは両方が同じタイプであることを意味しますか?またはchar8_t
他の機能がありますか?
char8_t
はchar
と同じではありません。 [basic.fundamental]/9 によるが、unsigned char
とまったく同じように動作します。
タイプ
char8_t
は、基礎となるタイプがunsigned char
である特殊タイプを示します。型char16_t
とchar32_t
は、uint_least16_t
の基になる型がそれぞれuint_least32_t
と<cstdint>.
である特殊な型を示します
重点鉱山
標準ではこれを異なる型と呼ぶため、次のようなコードに注意してください
std::cout << std::is_same_v<unsigned char, char8_t>;
0
はchar8_t
として実装されていますが、unsigned char
(false)を出力します。これはエイリアスではなく、特殊なタイプだからです。
もう1つ注意すべき点は、char
はsigned char
またはunsigned char
として実装できることです。つまり、char
がchar8_t
と同じ範囲と表現を持つことは可能ですが、それらはまだ別の型です。 char
、signed char
、unsigned char
、char8_t
は同じサイズですが、すべて異なるタイプです。
免責事項:私はchar8_t
P0482 および P142 の提案の作成者です。
C++ 20では、char8_t
は他のすべての型とは異なる型です。 Cの関連する提案 N2231 (これはWG14への更新と再提案が必要です)では、char8_t
は既存のunsigned char
と同様のtypedefになりますchar16_t
およびchar32_t
のtypedef。
C++ 20では、char8_t
はunsigned char
に一致する基本的な表現を持っています。したがって、unsigned char
と同じサイズ(少なくとも8ビットですが、それより大きくなる可能性があります)、配置、および整数変換ランクがありますが、エイリアス規則は異なります。
特に、char8_t
は [basic.lval] p11 のタイプのリストに追加されませんでした。 [basic.life] p6.4 、 [basic.types] p2 、または [basic.types] p4 。つまり、unsigned char
とは異なり、別のタイプのオブジェクトの基になるストレージに使用したり、他のタイプのオブジェクトの基になる表現を検査したりすることはできません。つまり、他の型のエイリアスには使用できません。この結果、タイプchar8_t
のオブジェクトには、char
またはunsigned char
へのポインターを介してアクセスできますが、char8_t
へのポインターを使用してchar
またはunsigned char
データ。言い換えると:
reinterpret_cast<const char *>(u8"text"); // Ok.
reinterpret_cast<const char8_t*>("text"); // Undefined behavior.
これらのプロパティを持つ特殊タイプの動機は次のとおりです。
UTF-8文字データと文字データの区別タイプを、ロケール依存のエンコードまたは個別の指定が必要なエンコードで提供するため。
通常の文字列リテラルとUTF-8文字列リテラルのオーバーロードを有効にするには(エンコードが異なる場合があるため)。
UTF-8データの署名なしの型を保証するため(char
が署名されているか、署名されていないかは、実装で定義されています)。
非エイリアシングタイプを介してパフォーマンスを向上させるには、オプティマイザは、他の型をエイリアスしない型をより適切に最適化できます。