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)。