std :: byte指针是否与char *具有相同的别名含义?

时间:2017-04-21 20:40:00

标签: c++ c++17 strict-aliasing

C ++(和C)严格别名规则包括char*unsigned char*可以为任何其他指针设置别名。

AFAIK uint8_t*没有类似的规则。

因此我的问题是:std::byte指针的别名规则是什么?

C ++参考目前只是specifies

  

与字符类型(char,unsigned char,signed char)类似,它可用于访问其他对象占用的原始内存(对象表示),但与这些类型不同,它不是字符类型,也不是算术类型。

1 个答案:

答案 0 :(得分:19)

从目前的标准草案([basic.types] / 2):

  

对于任何简单的对象(基类子对象除外)   可复制类型T,无论对象是否包含有效的类型值   T,构成对象的底层字节([intro.memory])可以是   复制到 char,unsigned char或std :: byte 的数组中   ([cstddef.syn])。 43 如果将该数组的内容复制回   对象,该对象随后应保持其原始值。

所以是的,相同的别名规则适用于这三种类型,就像cppreference总结一样。

提及([basic.lval] /8.8)可能也很有价值:

  

如果程序试图通过访问对象的存储值   行为是除以下类型之一以外的glvalue   未定义:

     
      
  • char,unsigned char或std :: byte type。
  •