我有这样的内存,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对,但你将如何获得这些左值?哦,我认为你可以使用参考。很公平。 –