Eri*_*Man 5 c++ strict-aliasing language-lawyer c++14 std-byte
std::byte在 C++17 中定义为:
enum class byte : unsigned char {};
Run Code Online (Sandbox Code Playgroud)
我目前坚持使用 C++14,我想知道如果我在 C++14 中添加相同的定义(在某些非 std 命名空间中,以及运算符重载等),这个新类型会得到相同的结果吗?将“free-pass”别名化为unsigned char或由于违反严格的别名规则而将自己设置为未定义的行为?
它似乎有效,但我想知道我是否应该选择它using byte = unsigned char;,这会导致其他并发症(例如,我无法区分 byte 和uint8_t)。
不,这是不可能的。别名异常仅特定于char,unsigned char和std::byte。您无法在标准 C++ 中定义类型来获得它们的“超能力”。
可能有特定于编译器的属性可以给出用以下声明的类型
enum class byte : unsigned char {};
Run Code Online (Sandbox Code Playgroud)
等效的别名异常,尽管别名也不是唯一的异常行为。
从技术上讲std::byte,也是unsigned char核心语言中的特定异常,它们能够为其他对象提供存储,并且是在其类型的数组的生命周期开始时可以导致隐式创建对象的唯一类型。其他类型也做不到。然而,在通常的 C++ 实现中,该部分在实践中可能并不那么相关。
std::byte和unsigned char(可能还有char)也是在某些非常特定的情况下有时允许对不确定值进行操作的唯一类型。但同样,在通常的 C++ 实现上,这可能不会成为实际问题。
array-new 表达式还有一个例外,它专门保证只适用于char,unsigned char并且std::byte分配的开头和数组的开头之间没有偏移量。不过,在实践中,实现可能会将此异常扩展到所有普通类型。
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |