[英]Is C++20 'char8_t' the same as our old 'char'?
在 CPP 參考文檔中,
我注意到了char
字符類型足夠大以表示任何 UTF-8 八位代碼單元 (C++14 起)
和char8_t
UTF-8 字符表示的類型,需要足夠大以表示任何 UTF-8 代碼單元(8 位)
這是否意味着兩者是同一類型? 或者char8_t
有其他一些功能嗎?
免責聲明:我是char8_t
P0482和P1423提案的作者。
在 C++20 中, char8_t
是與所有其他類型不同的類型。 在 C 的相關提案N2653 中, char8_t
是unsigned char
的類型定義,類似於char16_t
和char32_t
的現有類型定義。
在 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
不同,它不能用於另一種類型對象的底層存儲,也不能用於檢查其他類型對象的底層表示; 換句話說,它不能用於其他類型的別名。 這樣做的結果是,可以通過指向char
或unsigned char
指針訪問char8_t
類型的對象,但不能使用指向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
是有符號還是無符號是實現定義的)。
通過非鋸齒類型實現更好的性能; 優化器可以更好地優化沒有別名其他類型的類型。
char8_t
與char
。 盡管根據[basic.fundamental]/9,它的行為與unsigned char
完全相同
類型
char8_t
表示一個不同的類型,其基礎類型是unsigned char
。 類型char16_t
和char32_t
表示在<cstdint>.
基礎類型分別為uint_least16_t
和uint_least32_t
不同類型<cstdint>.
強調我的
請注意,由於標准將其稱為不同類型,因此代碼如下
std::cout << std::is_same_v<unsigned char, char8_t>;
將打印0
(false),即使char8_t
被實現為unsigned char
。 這是因為它不是別名,而是一個獨特的類型。
另一件要注意的事情是char
可以實現為signed char
或unsigned char
。 這意味着char
可能具有與char8_t
相同的范圍和表示char8_t
,但它們仍然是不同的類型。 char
、 signed char
、 unsigned char
和char8_t
的大小相同,但它們都是不同的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.