簡體   English   中英

C++20 'char8_t' 和我們舊的 'char' 一樣嗎?

[英]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 P0482P1423提案的作者。

在 C++20 中, char8_t是與所有其他類型不同的類型。 在 C 的相關提案N2653 中char8_tunsigned char的類型定義,類似於char16_tchar32_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不同,它不能用於另一種類型對象的底層存儲,也不能用於檢查其他類型對象的底層表示; 換句話說,它不能用於其他類型的別名。 這樣做的結果是,可以通過指向charunsigned char指針訪問char8_t類型的對象,但不能使用指向char8_t指針訪問charunsigned char數據。 換句話說:

reinterpret_cast<const char   *>(u8"text"); // Ok.
reinterpret_cast<const char8_t*>("text");   // Undefined behavior.

具有這些屬性的獨特類型的動機是:

  1. 為 UTF-8 字符數據與具有依賴於語言環境或需要單獨規范的編碼的字符數據提供不同的類型。

  2. 為普通字符串文字與 UTF-8 字符串文字啟用重載(因為它們可能具有不同的編碼)。

  3. 確保 UTF-8 數據的無符號類型( char是有符號還是無符號是實現定義的)。

  4. 通過非鋸齒類型實現更好的性能; 優化器可以更好地優化沒有別名其他類型的類型。

char8_tchar 盡管根據[basic.fundamental]/9,它的行為與unsigned char完全相同

類型char8_t表示一個不同的類型,其基礎類型是unsigned char 類型char16_tchar32_t表示在<cstdint>.基礎類型分別為uint_least16_tuint_least32_t不同類型<cstdint>.

強調我的


請注意,由於標准將其稱為不同類型,因此代碼如下

std::cout << std::is_same_v<unsigned char, char8_t>;

將打印0 (false),即使char8_t被實現為unsigned char 這是因為它不是別名,而是一個獨特的類型。


另一件要注意的事情是char可以實現為signed charunsigned char 這意味着char可能具有與char8_t相同的范圍和表示char8_t ,但它們仍然是不同的類型。 charsigned charunsigned charchar8_t的大小相同,但它們都是不同的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM