5

似乎以下内容可以保证通过(已在此处询问):

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

引用cppreference

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

是否也保证int8_tanduint8_t是根据未定义的显式签名类型 定义的,因此也与 形成一组 3 个不同的类型?charchar

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

2 回答 2

7

在您的第一点上,是的,char,signed charunsigned char必须始终是不同的类型。

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

于 2019-08-29T07:06:40.343 回答
7

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

于 2019-08-29T07:14:18.590 回答