C++中数组如何提供存储?unsigned char及std::byte数组适用规则疑问
问题解答
1. 此处提及的数组是原生数组还是std::array?
是unsigned char C[N]这类原生数组。std::array是标准库封装的类容器,不属于标准此处定义的数组类型范畴,它内部持有的原生存储才可能满足要求,但std::array对象本身不属于条款所指的「数组对象」。
2. 是否只有这两种类型的数组支持为新对象提供存储?
对,当前C++标准明确规定,只有unsigned char类型的原生数组、std::byte类型的原生数组具备为其他对象提供存储的合法语义。
3. 用普通char数组代替会有什么问题?
普通char类型的符号属性是实现定义的,同时标准并未将char(无论实现是带符号还是不带符号)纳入可提供存储的数组元素类型范畴。如果你在普通char数组上创建其他对象,属于未定义行为:
- 你创建的对象无法获得标准认可的合法生命周期,编译器优化时可能会因为假定
char数组内容不会被其他类型对象修改,而做出不符合你预期的优化 - 后续指针转换、对象访问的合法性都无法得到标准保障
- 即使部分编译器为了兼容旧代码做了支持,这类代码也不具备可移植性
内容的提问来源于stack exchange,提问作者user15071942
相关产品推荐
相关产品推荐

