如果npos为-1,size_type如何成为无符号整数?

时间:2016-05-02 20:34:59

标签: c++ string stl size-t size-type

如果std::size_type的{​​{1}}是默认分配器的std::string

  

21.3.1班级模板basic_string
   typedef typename allocator_traits<Allocator>::size_type size_type;

默认分配器的std::size_typestd::size_t

typedef size_t size_type;
  

20.9.9默认分配器
  std::size_t

我们知道std::size_t始终是无符号整数类型

  

C ++标准
   5.3.3尺寸
  sizeof和sizeof ...的结果是<cstddef>类型的常量   [注意:std :: size_t在标准标题<stddef.h>

中定义      

8.2类型
  内容与标准C库标题size_t相同,但有以下更改:

  

C标准
   6.5.3.4 sizeof和_Alignof运算符
  两个运算符的结果值是实现定义的,
  它的类型(无符号整数类型)是<stddef.h>,定义于   size_type(以及其他标题)。

std::basic_string::npos(定义为JsonConvert.DefaultSettings = () => { return new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Auto }; }; )如何为-1?

2 个答案:

答案 0 :(得分:4)

C ++规范要求签名类型可以转换为无符号类型。 §4.7/ 2表明

  

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

这意味着即使productTabs是无符号的,C ++规范也保证-1可以转换为size_type,结果将等于最大可能size_type因为添加1到那个数字需要回馈0。

答案 1 :(得分:2)

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