为什么随机访问迭代器的算术运算符接受/返回int而不是size_t?

时间:2014-03-21 12:59:13

标签: c++ iterator

由于std::vector上的大多数操作都需要/返回size_t - 这就是我用于索引的类型。但是现在我已经启用所有编译器警告来修复我知道的一些已签名/未签名的转换问题,这条消息让我感到惊讶:

  

警告C4365:'参数':从'size_t'转换为'__w64 int',签名/无符号不匹配

它是由此代码生成的:

std::vector<int> v;
size_t idx = 0;
v.insert(v.begin() + idx + 1, 0);

我有很多其他类似的消息表明迭代器的算术运算符接受并返回int。为什么不size_t?修复所有这些消息是一件痛苦的事,并不能使我的代码更漂亮!

2 个答案:

答案 0 :(得分:7)

  

我还有很多其他类似的消息表明迭代器的算术运算符接受并返回int

不一定是int。它是迭代器类型difference_type定义的(签名)iterator_traits。对于大多数迭代器类型,默认为ptrdiff_t

  

为什么不size_t

因为算术需要使用带符号的值才能正常工作;人们希望it + (-1)等同于it - 1

答案 1 :(得分:2)

它允许像it += index;那样index可以是正面的或负面的(根据某些逻辑)。

与以下内容比较:

if (some_condition)
    it += index;
else
    it -= index;

如果我们只能传递无符号值,那将是必需的。