我正在阅读类型别名规则,但不知道这段代码中是否有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
。