有没有合法的方法将unsigned char指针转换为std :: byte指针?

Gui*_*cot -1 c++ casting bytebuffer strict-aliasing

我使用STB库将图像加载到内存中.特定函数stbi_load返回指向a的指针unsigned char,该指针是一个数组.

我很想将新的C++ 17 API用于原始数据,std::byte这将使我更具表现力,让我逐个像素地对原始数据进行别名,或者通过将其转换为不同的数据类型来逐个颜色(不同大小的整数).

现在我尝试了这个:

std::unique_ptr<std::byte[], stbi_deleter>(stbi_load(...));
Run Code Online (Sandbox Code Playgroud)

当然,由于缺乏隐式转换,它不起作用.

然后我尝试了:

std::unique_ptr<std::byte[], stbi_deleter>(
  static_cast<std::byte*>(stbi_load(...))
);
Run Code Online (Sandbox Code Playgroud)

同样,它仍然没有奏效.我不得不决定使用reinterpret_cast.并让我怀疑这种转换是否合法.我unsigned char*可以std::byte* 根据严格的别名规则合法地转换为?然后我可以将数据转换为另一种数据类型std::uint32_t*并进行变异吗?这会破坏别名规则吗?

M.M*_*M.M 5

严格别名规则从不禁止任何指针转换.它是关于访问对象的表达式的类型.

std::byte可以为任何其他类型添加别名,这在您链接的cppreference页面中以及标准中的严格别名规则(C++ 17 basic.lval/8.8)中提到.所以可以使用reinterpret_cast<std::byte *>然后读取或写入数组unsigned char.

如果使用类型的表达式uint32_t来读取或写入数组unsigned char,则会违反严格的别名规则.