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

Why do random access iterator's arithmetic operators accept / return int and not size_t?

本文关键字:int 返回 size 迭代器 访问 随机 运算符 为什么      更新时间:2023-10-16

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

警告:'argument':从'size_t'转换为'__w64 int',有符号/无符号不匹配

它是由以下代码生成的:

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

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

我得到了很多其他类似的消息,暗示迭代器的算术运算符接受并返回int

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

为什么不是size_t ?

因为算术需要正确地处理有符号值;可以期望it + (-1)等于it - 1

它允许像it += index;这样的东西,其中index可以是正的或负的(根据某些逻辑)。

与以下内容比较:

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

如果只能传递无符号值,则需要