2017-10-19 30 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数组中创建对象。然后该区域被认为是创建类型的对象,不再是对齐的存储类的对象等。 –