我有這樣的內存,char
數組是根據標準在C++中唯一可安全打斷的類型。也就是說,如果您有指向char
的適當對齊和大小數組的第一個元素的char*
指針,則該指針安全到reinterpret_cast<T*>
,但不安全。根據標準uint8_t
。C++:根據標準對字符數組進行剔除有什麼特別之處?
但是,在目前的草案標準中,我找不到這個地方。我誤解了嗎?對C++ 17做了這個改變嗎?有人可以引用標準的相關部分嗎?
我有這樣的內存,char
數組是根據標準在C++中唯一可安全打斷的類型。也就是說,如果您有指向char
的適當對齊和大小數組的第一個元素的char*
指針,則該指針安全到reinterpret_cast<T*>
,但不安全。根據標準uint8_t
。C++:根據標準對字符數組進行剔除有什麼特別之處?
但是,在目前的草案標準中,我找不到這個地方。我誤解了嗎?對C++ 17做了這個改變嗎?有人可以引用標準的相關部分嗎?
這是一個嚴格的混疊違反使用T
類型的表達式來讀取或寫入的char
陣列(如果T
不在規則例外之一)。
嚴格別名不是雙向街道:您可以使用char
表達式來訪問T
,但反之亦然。
的段是[basic.lval]/10中的C++ 14標準。 See here的全文。
此外,標準說uint8_t
爲另一種類型的一個typedef。所有已知的實現使它成爲char
或unsigned char
的typedef。
有人建議標準明確指定uint8_t
是一個字符類型。這也可以解決像uint8_t x = 'a'; cout << x;
這樣的問題不明確。
謝謝,我認爲嚴格別名規則中的'char'的例外([draft standard link](http://eel.is/c++draft/basic#lval-8))正是我想到的。 – jacobsa
雖然這是如何與'std :: aligned_storage'之類的東西進行交互?當然,有一些標準安全的方法可以將一列'char'變成一個'T *'?或者只有通過像'std :: aligned_storage'這樣的祝福類型? – jacobsa
@jacobsa您使用placement-new在對齊的存儲或char數組中創建對象。然後該區域被認爲是創建類型的對象,不再是對齊的存儲類的對象等。 –
你是。 char char數組沒有什麼特別之處。 'char * *指針*有一些特殊之處。 –
@ n.m。其他方式(有點)...有沒有什麼特別的關於字符指針,但是'char'左值是特殊的(在嚴格的別名方面)。 –
@ M.M對,但你將如何獲得這些左值?哦,我認爲你可以使用參考。很公平。 –