讓我們考慮:C++移植的方式得到一個U8字符串字面
char const str[] = u8"ñ";
auto const* u8_code_units = reinterpret_cast<unsigned char*>(str);
// using u8_code_units elements
那是完全便攜和C++標準兼容?或者有一些條款說明它是未定義的行爲或取決於任何未指定的值?我知道unsigned char
和char
應具有相同的對齊要求,並且reinterpret_cast<T*>(v)
等於在這種情況下爲static_cast<T*>(static_cast<void*>(v))
,所以我認爲使用它完全安全和便攜,但我不確定。
需要對齊需求,以確保從'void *'到'T2'的轉換在'static_cast(t2)'之前返回與't2'相同的存儲位置。這就是我評論它的原因。並感謝指出我的「別名」的事情。我搜索了一下,並且我已經在標準中發現嚴格的別名異常(3.10§10)。 –
相關問題:是讀取底層字節的唯一方法嗎? –
@ Peregring-lk:你可以把它看作char。該標準保證在'unsigned char'範圍內0-255,映射到'char'的值爲1:1。因此,如果將值0x80轉換爲「char」,則保證與0x80的「unsigned char」值相等。當然,如果你想擺弄UTF-8操作,你需要將它們讀作'unsigned char'。 –