如果std::string
的std::size_type
是默认分配器的,
21.3.1 类模板basic_string
typedef typename allocator_traits<Allocator>::size_type size_type;
而默认分配器的std::size_type
是std::size_t
,
20.9.9 默认分配器
typedef size_t size_type;
我们知道std::size_t
始终是无符号整数类型,
C++标准
5.3.3 大小
大小和大小的结果...是类型std::size_t
的常量。
[ 注意:std::size_t 在标准标头<cstddef>
中定义8.2 类型
内容与标准C库头<stddef.h>
相同,但有以下变化:
C 标准
6.5.3.4 运算符
的大小和_Alignof 两个运算符的结果值都是实现定义的,
其类型(无符号整数类型(为size_t
,定义于<stddef.h>
(和其他标头(。
std::basic_string::npos(定义为size_type
(怎么可能是-1?
C++规范要求可以将有符号类型转换为无符号类型。 §4.7/2 指出
如果目标类型为无符号,则结果值是与源全等的最小无符号整数 整数(模 2n,其中 n 是用于表示无符号类型的位数(
这意味着 C++ 规范保证 -1 可以转换为 size_type
,即使 size_type
是无符号的,并且结果将等于最大可能size_type
因为将该数字加 1 需要返回 0。
该定义使用无符号整数遵循模算术的事实,并且-1
转换为给定类型的最大无符号整数。