2017-10-19 53 views
0

我有這樣的內存,char數組是根據標準在C++中唯一可安全打斷的類型。也就是說,如果您有指向char的適當對齊和大小數組的第一個元素的char*指針,則該指針安全到reinterpret_cast<T*>,但不安全。根據標準uint8_tC++:根據標準對字符數組進行剔除有什麼特別之處?

但是,在目前的草案標準中,我找不到這個地方。我誤解了嗎?對C++ 17做了這個改變嗎?有人可以引用標準的相關部分嗎?

+3

你是。 char char數組沒有什麼特別之處。 'char * *指針*有一些特殊之處。 –

+0

@ n.m。其他方式(有點)...有沒有什麼特別的關於字符指針,但是'char'左值是特殊的(在嚴格的別名方面)。 –

+0

@ M.M對,但你將如何獲得這些左值?哦,我認爲你可以使用參考。很公平。 –

回答

2

這是一個嚴格的混疊違反使用T類型的表達式來讀取或寫入的char陣列(如果T不在規則例外之一)。

嚴格別名不是雙向街道:您可以使用char表達式來訪問T,但反之亦然。

的段是[basic.lval]/10中的C++ 14標準。 See here的全文。

此外,標準說uint8_t爲另一種類型的一個typedef。所有已知的實現使它成爲charunsigned char的typedef。

有人建議標準明確指定uint8_t是一個字符類型。這也可以解決像uint8_t x = 'a'; cout << x;這樣的問題不明確。

+0

謝謝,我認爲嚴格別名規則中的'char'的例外([draft standard link](http://eel.is/c++draft/basic#lval-8))正是我想到的。 – jacobsa

+0

雖然這是如何與'std :: aligned_storage'之類的東西進行交互?當然,有一些標準安全的方法可以將一列'char'變成一個'T *'?或者只有通過像'std :: aligned_storage'這樣的祝福類型? – jacobsa

+0

@jacobsa您使用placement-new在對齊的存儲或char數組中創建對象。然後該區域被認爲是創建類型的對象,不再是對齊的存儲類的對象等。 –