标准是否保证uint8_t,int8_t和char都是唯一类型?

Eri*_*ric 5 c++ char language-lawyer cstdint

似乎可以保证通过以下要求(已经在这里提出了要求):

#include <type_traits>
static_assert(!std::is_same_v<char, signed char>);
static_assert(!std::is_same_v<char, unsigned char>);
Run Code Online (Sandbox Code Playgroud)

引用cppreference

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

难道这也保证了int8_tuint8_t在明确有符号类型来定义 在来定义char的,因此也形成了一套3种不同类型的用char

#include <cstdint>
#include <type_traits>
static_assert(!std::is_same_v<char, int8_t>);
static_assert(!std::is_same_v<char, uint8_t>);
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 7

在您的第一点,是的,charsigned char,和unsigned char必须始终截然不同的类型。

在第二点上,int8_tuint8_t可能是(或可能不是)char(或它的signedunsigned变体)相同的类型;即没有保证或反对。


Rem*_*eau 7

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