char* 和 std::byte* 之间的reinterpret_cast

Gar*_*zet 4 c++ language-lawyer reinterpret-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';
Run Code Online (Sandbox Code Playgroud)

我相当确定事实并非如此,但我经常对 C++ 感到惊讶。介于和 之间并且reinterpret_cast始终char*允许吗?unsigned char*std::byte*

此外,在此类转换中添加合法的内容,例如:const

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

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

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

但我想reinterpret_cast一劳永逸地确定。

bol*_*lov 5

代码没问题。

\n

char*std::byte*标准允许为任何指针类型起别名。(要小心,因为相反的情况是不正确的)。

\n

([基本类型]/2):

\n
\n

对于任何可复制类型 T 的对象(基类子对象除外),无论该对象是否拥有类型 T 的有效值,组成该对象的底层字节 ([intro.memory]) 都可以是\n n 复制到char、unsigned char 或 std\xe2\x80\x8b::\xe2\x80\x8bbyte \n([cstddef.syn])数组中。43如果该数组的内容被复制回对象,则该对象随后应保留其原始值。

\n
\n

([基本.lval]/8.8):

\n
\n

如果程序尝试通过下列类型之一以外的泛左值来访问对象的存储值,则行为是未定义的:

\n
    \n
  • char、unsigned char 或 std\xe2\x80\x8b::\xe2\x80\x8bbyte 类型。
  • \n
\n
\n

是的,您可以添加const.

\n