uint_least8_t
很可能绑定到unsigned char
,而int_least8_t
绑定到signed char
。
标准是否保证类似的事情不会发生在size_t
或类似类型上?还是至少有一种纯理论上的机会,这些类型将绑定到一些char类型,如unsigned char
,甚至可能是wchar_t
?
我们所知道的关于std::size_t
的信息如下:
类型size_t是一个实现定义的无符号整数类型,它足够大以容纳任何对象的字节数。
如果unsigned char
满足这个条件,它可以被用作std::size_t
。
然而,这种情况纯粹是理论上的问题,因为没有一个真实的平台(据我所知)在那里(好吧,这是错误的),char类型被用作unsigned char
将足够宽std::size_t
或类似的类型。
如果你非常谨慎,你可以使用一元运算符+
将值提升至至少int
:
std::cout << +vector.size();
std :: common_type <unsigned int,std :: size_t> :: type 的变量(可能通过typedef),然后在sizeof(int)> sizeof(std :: size_t)的情况下进行边界检查。
std::cout
时是正确的,但是使用std::cin
会变得有点困难。 - user4385532CHAR_BIT> 8
;特别是,我认为存在CHAR_BIT == 32
。但是,在这样的系统上,unsigned int
也可能是32位,并且将是size_t
的更好选择,因此没有充分的理由使size_t
成为字符类型。 - Keith Thompsonstd::common_type<unsigned int, std::size_t>::type
的变量。它至少和 std::size_t
一样大,至少是一个 unsigned int
,然后在 sizeof(int) > sizeof(std::size_t)
的情况下进行边界检查。 :) - Baum mit Augencommon_type
的使用是可行的,因为 int
的转换级别比 char
高,并且对于 cin
来说, wchar
无关紧要。关于“丑陋”的部分:我想如果您想要如此谨慎,那就必须接受它。 - Baum mit Augen文档N3337是目前免费在线获取的最接近C++11的版本。相关章节包括3.9.1 [basic.fundamental],18.2 [support.types]和18.4 [cstdint]。
除了wchar_t
之外,您感兴趣的所有类型名称都需要是适当有符号性的原始整数类型的typedef
。 signed char
和unsigned char
被认为是原始整数类型;普通的char
则不是。 wchar_t
是特殊的;在C++(而不是C)中,它是一个关键字(如int
)和一个独立的原始类型。
普通的char
、signed char
和unsigned char
被认为是字符类型;wchar_t
、char16_t
和char32_t
不是字符类型(也不是整数类型)。
所以答案是,除了wchar_t
之外,你提到的所有类型都可以被定义为signed char
或unsigned char
,但不能作为普通的char
。
是的,这很令人困惑。这反映了与C的兼容性不同程度的纠缠历史,以及如何处理无法用ASCII表示的文本的不断变化的想法。
char
、signed char
、unsigned char
、wchar_t
、char16_t
、char32_t
都是整数类型。请参见N3337中的[basic.fundamental]/7。字符类型是整数类型的子集。 - M.Mchar
、wchar_t
和char*_t
在这些列表中并没有出现。 - zwol'\0'
是C++中有效的空指针常量,但它不应该是。 - zwol'\0'
不 是一个有效的空指针常量。也许我们中的某个人应该提交一个缺陷报告。 - zwol
unsigned char
зҡ„дҪҚж•°и¶іеӨҹж—¶пјҢе®ғе®Ңе…ЁеҸҜд»Ҙз”ЁдәҺsize_t
гҖӮ - chriscout << vector.size()
可能是一个危险的操作吗?更不用说vector<int>::size_type n; cin >> n; vector<int> t(n)
了吧? - user4385532