如果std::size_type
std::字符串是默认分配器的,
21.3.1类模板basic_stringtypedef typenameallocator_traits
默认分配器的std::size_type
是std::size_t,
20.9.9默认分配器typedefsize_tsize_type;
并且我们知道std::size_t
始终是无符号整数类型,
C Standard
5.3.3 sizeof
sizeof和sizeof…的结果是类型为std::size_t
的常量。
[注意:std::size_t在标准头中定义
8.2 Types
内容与标准C库头相同
C标准
6.5.3.4sizeof和_Alignof运算符
两个运算符的结果值都是实现定义的,
其类型(无符号整数类型)是size_t
,在中定义
std::basic_string::npos(定义为size_type
)如何为-1?
C规范要求有符号类型可以转换为无符号类型。§4.7/2规定
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(取模2n其中n是用于表示无符号类型的位数)
这意味着C规范保证-1可以转换为size_type
,即使size_type
是无符号的,结果将等于最大可能的size_type
,因为在该数字上添加1需要返回0。
该定义使用了无符号整数遵循模块化算术的事实,并且-1
转换为给定类型的最大无符号整数。