【问题标题】:Does the standard guarantee that uint8_t, int8_t, and char are all unique types?标准是否保证 uint8_t、int8_t 和 char 都是唯一类型?
【发布时间】:2019-08-29 07:05:01
【问题描述】:

似乎以下内容可以保证通过(已经问过here):

#include <type_traits>
static_assert(!std::is_same_v<char, signed char>);
static_assert(!std::is_same_v<char, unsigned char>);

引用cppreference

[char] 与signed charunsigned char 具有相同的表示和对齐方式,但始终是不同的类型

是否也保证int8_tuint8_t根据显式签名类型定义的 不是根据char 定义的,因此也用char形成一组3种不同的类型?

#include <cstdint>
#include <type_traits>
static_assert(!std::is_same_v<char, int8_t>);
static_assert(!std::is_same_v<char, uint8_t>);

【问题讨论】:

  • 我不希望标准指定几乎不相关的东西,这会让我觉得过度指定。 (而且我不知何故看不到 int8/uint8 与 char 的关系,除了 char 很可能也由 8 位表示并且您可以在它们之间安全地转换,但在我看来,这些都与使类型相同/非相关标准相同。

标签: c++ char language-lawyer cstdint


【解决方案1】:

首先,是的,charsigned charunsigned char 必须始终是不同的类型。

关于第二点,int8_tuint8_t 可能与 char(或其 signedunsigned 变体)的类型相同,也可能不同;即不保证支持或反对。

【讨论】:

    【解决方案2】:

    固定宽度类型是实现定义的别名。 (u)int8_t 类型根本不保证是任何基本 char 类型的别名。它们只保证是(无)有符号的 8 位整数类型。它们可能是(un)signed char 的别名,也可能是供应商特定类型的别名,例如(un)signed __int8。由每个编译器供应商决定哪些别名最适合他们的实现。

    【讨论】:

    • 我更新了我的问题 - 我希望保证它们是不合格 charnot 别名,因为如果它们是我无法专门为char 不匹配其中一种类型。
    • @Eric:不,没有这样的保证:如果charunsignedtypedef char uint8_t; 会这样做,尽管我猜想 sensible 实现会使用typedef unsigned char uint8_t;.
    • 在某种程度上,我认为标准的工作是要求一个合理的实现:)。我想这是一个非常小的刺,虽然可以花委员会的时间......
    • @Eric 如果char 专业化也涵盖这两种类型之一,那么确切的问题是什么?如果您为uint8_tint8_t 添加另外两个专业化,它是否会发生冲突?这对我来说听起来像是真正的问题,但我期望编译器然后通过检查专业化的特定类型并将它们三个都视为不同的类型来处理这种歧义。 clang 8.0.0 似乎可以做到这一点:godbolt.org/z/gphsmB(对我来说这看起来没有问题,因为如果您的代码想要专门针对某种类型,它可以)
    猜你喜欢
    • 2013-04-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多