由于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
?修复所有这些消息是一件痛苦的事,并不能使我的代码更漂亮!
答案 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;
如果我们只能传递无符号值,那将是必需的。