【问题标题】:Has a std::byte pointer the same aliasing implications as char*?具有与 char* 相同的别名含义的 std::byte 指针吗?
【发布时间】:2017-09-18 23:38:19
【问题描述】:

C++(和 C)严格的别名规则包括 char*unsigned char* 可以别名任何其他指针。

AFAIK 对于uint8_t* 没有类似的规则。

因此我的问题是:std::byte 指针的别名规则是什么?

C++ 参考目前只是specifies:

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

【问题讨论】:

  • en.cppreference.com/w/cpp/language/… 相同的别名规则适用于 std::bytechar
  • @Justin:您可能想要更清楚一点,因为“适用规则”并没有说明适用哪些规则。 std::bytecharunsigned char 具有相同的规则。
  • @Justin:不是在你第一次发帖的时候(你有:“en.cppreference.com/w/cpp/language/…别名规则适用于std::byte”)。你已经编辑过;我加载了它预编辑。感谢修复。

标签: c++ c++17 strict-aliasing


【解决方案1】:

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

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

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

提及 ([basic.lval]/8.8) 也可能很有价值:

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

  • char、unsigned char 或 std​::​byte 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2021-11-26
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多