C++ 是否保证size_t、vector::size_type等typedefs不会';不能绑定到字符类型?

C++ 是否保证size_t、vector::size_type等typedefs不会';不能绑定到字符类型?,c++,char,size-t,C++,Char,Size T,cstdinttypedefs绑定到char变量是绝对可能的。例如,uint\u least8\u t很可能绑定到unsigned char,而int\u least8\u t绑定到signed char 标准是否保证类似的事情不会发生在size\t或类似的类型上?或者至少有一种纯粹理论上的可能性,这种类型将绑定到一些字符类型,比如无符号字符,或者甚至可能wchar\u t?我们所知道的std::size\u t是: 类型size\u t是实现定义的无符号整数类型,其大小足以包含大小 以任何对象

cstdint
typedefs绑定到char变量是绝对可能的。例如,
uint\u least8\u t
很可能绑定到
unsigned char
,而
int\u least8\u t
绑定到
signed char


标准是否保证类似的事情不会发生在
size\t
或类似的类型上?或者至少有一种纯粹理论上的可能性,这种类型将绑定到一些字符类型,比如
无符号字符
,或者甚至可能
wchar\u t

我们所知道的
std::size\u t
是:

类型size\u t是实现定义的无符号整数类型,其大小足以包含大小 以任何对象的字节为单位

如果
unsigned char
满足此条件,则可将其用作
std::size\t

然而,这种担心纯粹是理论上的,因为没有一个真正的平台(据我所知)
unsigned char
足够宽(好吧,这是错误的),char类型被用作
std::size\u t

如果您是超级偏执狂,您可以使用一元
+
将值提升到至少
int

std::cout << +vector.size();
std::cout-sizeof(std::size\u t)

文档是最接近于C++11的,可以在线免费获得。相关章节包括3.9.1[基本.基本]、18.2[支撑.类型]和18.4[支撑力]

除了
wchar\u t
之外,所有您感兴趣的类型名称都必须是
typedef
s,才能用于具有适当符号的基本整数类型
signed char
unsigned char
被认为是基本整数类型;普通
char
不是
wchar\u t
是特殊的;在C++(非C)中,它是一个关键字(如<代码> int >代码>)和一个不同的基元类型。


普通
字符
有符号字符
无符号字符
被视为字符类型
wchar\u t
char16\u t
char32\u t
不是字符类型(也不是整数类型)

因此答案是,除了
wchar\u t
,您提到的所有类型都可以被定义为
有符号字符
无符号字符
,而不是普通的
字符


是的,这令人困惑。它反映了一段混乱的历史,它与C的兼容程度不同,关于如何处理不能用ASCII表示的文本的想法也在不断变化。

当然,如果
无符号字符
有足够的位,那么它就没有理由不能用于
大小
;向量t(n)?如果你有一个足够奇怪的实现,我想是这样。std::cout是这样,但std::cin让事情变得更难了。我不确定你的最后一段是否完全正确。对于具有
CHAR_BIT>8
的DSP(数字信号处理器),有C实现;特别是,我认为存在
CHAR\u BIT==32
。不过,在这样一个系统上,
无符号int
可能也是32位的,对于
size\u t
,它是一个更好的候选,所以仍然没有充分的理由将
size\u t
作为字符类型。@KeithThompson好的,我在这一段中添加了一个黄鼠狼短语。有些机器的字符肯定足够宽。编辑我来晚了…@gaazkam您可以开始读取类型为
std::common\u type::type
的变量。这至少与
std::size\u t
一样大,并且至少是一个
无符号int
,然后在
sizeof(int)>sizeof(std::size\u t)
的情况下执行边界检查:
char
signed char
unsigned char
wchar\u t
char16\u t
char32\u t
都是整数类型。参见N3337中的[basic.basic]/7。字符类型是整数类型的子集。@M.M我想你把整数类型和整数类型混淆了。我相信[basic.basical]/2和/3中列出的类型是唯一的整数类型。请注意,
char
wchar\u t
char*\u t
不会出现在这些列表中。[basic.basic]/7说“整数类型的同义词是整数类型”。@M.M.你是对的,但这是标准中的一个bug(可以追溯到C++98),因为有很多地方像“整型整型整型常量表达式”用于排除字符和枚举类型。例如,4.10对空指针常量的定义:如果[basic.basical]/7取面值,则“整型整型整型”“部分是空的,而<代码>”0’< /代码>是C++中一个有效的空指针常数,它不应该是.<代码> 0 ''/COD>是一个有效的空指针,恒流编译器接受它(应该是,IMO)。