是否可以将 std::byte 向后移植到 C++14

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

std::byte
在 C++17 中定义为:

enum class byte : unsigned char {};

我目前坚持使用 C++14,我想知道如果我在 C++14 中添加相同的定义(在某些非 std 命名空间中,以及运算符重载等),这个新类型会得到与

unsigned char
相同的别名“自由通行”还是我因违反严格的别名规则而将自己设置为未定义的行为?

它似乎有效,但我想知道我是否应该选择

using byte = unsigned char;
,这可悲地导致其他并发症(例如,我无法区分字节和
uint8_t
)。

c++ c++14 language-lawyer strict-aliasing
1个回答
0
投票

不,这是不可能的。别名异常仅特定于

char
unsigned char
std::byte
。您无法用标准 C++ 编写类型来获得它们的“超能力”。

可能有特定于编译器的属性可以给出用

声明的类型
enum class byte : unsigned char {};

等效的别名异常,尽管别名也不是唯一的异常行为。从技术上讲,

std::byte
unsigned char
也是核心语言中的特定例外,能够为其他对象提供存储。其他类型无法做到这一点。然而,在通常的 C++ 实现中,这部分在实践中可能并不那么相关。

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