由于 std::vector
上的大多数操作都需要/返回 size_t
- 这就是我用于索引的类型。但现在我已经启用所有编译器警告来修复一些我知道的有符号/无符号转换问题,这条消息让我感到惊讶:
warning C4365: 'argument' : conversion from 'size_t' to '__w64 int', signed/unsigned mismatch
它是由这段代码生成的:
std::vector<int> v;
size_t idx = 0;
v.insert(v.begin() + idx + 1, 0);
我收到很多其他类似的消息,建议迭代器的算术运算符接受并返回 int
。为什么不是 size_t
?修复所有这些消息很痛苦,并且不会使我的代码更漂亮!
最佳答案
I've got a lot of other similar messages suggesting that iterator's arithmetic operators accept and return
int
.
不一定int
。它是由迭代器类型的 iterator_traits
定义的(有符号的)difference_type
。对于大多数迭代器类型,这默认为 ptrdiff_t
。
Why not
size_t
?
因为算术需要正确处理带符号的值;人们会期望 it + (-1)
等同于 it - 1
。
关于c++ - 为什么随机访问迭代器的算术运算符接受/返回 int 而不是 size_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22559499/