在char*和std::byte*之间进行interpret_cast



我正在阅读类型别名规则,但不知道这段代码中是否有UB:

std::vector<std::byte> vec = {std::byte{'a'}, std::byte{'b'}};
auto sv = std::string_view(reinterpret_cast<char*>(vec.data()), vec.size());
std::cout << sv << 'n';

我确信它不是,但我经常对C++感到惊讶。是否始终允许char*unsigned char*std::byte*之间的reinterpret_cast

此外,const添加在此类演员阵容中合法吗,例如:

std::array<char, 2> arr = {'a', 'b'};
auto* p = reinterpret_cast<const std::byte*>(arr.data());

再次,我怀疑它是合法的,因为它说

AliasedType是DynamicType 的有符号或无符号变体(可能是cv限定的)

但我想一劳永逸地确定reinterpret_cast

代码正常。

CCD_ 7和CCD_。(要小心,因为事实并非如此)。

([基本类型]/2):

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

([basic.lval]/8.8):

如果程序试图通过不是以下类型之一的glvalue行为未定义:

  • 字符、无符号字符或std​::​字节类型

是的,您可以添加const

最新更新