提问者:小点点

如果npos是-1,size_type怎么可能是无符号积分?


如果std::size_typestd::字符串是默认分配器的,

21.3.1类模板basic_string
typedef 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?


共2个答案

匿名用户

C规范要求有符号类型可以转换为无符号类型。§4.7/2规定

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(取模2n其中n是用于表示无符号类型的位数)

这意味着C规范保证-1可以转换为size_type,即使size_type是无符号的,结果将等于最大可能的size_type,因为在该数字上添加1需要返回0。

匿名用户

该定义使用了无符号整数遵循模块化算术的事实,并且-1转换为给定类型的最大无符号整数。