指向 std::byte 的指针是否具有与 char* 相同的别名松弛?

问题描述 投票:0回答:1

C++(和 C)严格的别名规则包括

char*
unsigned char*
可以为任何其他指针起别名。

据我所知,

uint8_t*
没有类似的规则。

因此我的问题是:

std::byte
指针的别名规则是什么?

C++ 参考目前仅指定

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

c++ c++17 language-lawyer strict-aliasing std-byte
1个回答
24
投票

来自当前标准草案([basic.types.general]/2):

对于普通可复制类型

T
的任何对象(潜在重叠的子对象除外),无论该对象是否持有类型
T
的有效值,底层字节 ([intro.memory]) 构成可以将该对象复制到
char
unsigned char
std​::​byte
([cstddef.syn]) 数组中。 如果该数组的内容被复制回对象中,则该对象随后应保留其原始值。

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

值得一提的是([basic.lval]/11):

如果程序尝试通过类型与以下类型之一不相似的泛左值访问对象的存储值,则行为未定义:44

  • [...]
  • a
    char
    unsigned char
    std​::​byte
    类型。

44 此列表的目的是指定对象可以或不可以使用别名的情况。

© www.soinside.com 2019 - 2024. All rights reserved.