简体   繁体   中英

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

Since most operations on std::vector require / return size_t - that's the type I use for indexing. But now I've enabled all compiler warnings to fix some signed / unsigned conversion issues that I know I have, and this message surprised me:

warning C4365: 'argument' : conversion from 'size_t' to '__w64 int', signed/unsigned mismatch

It was generated by this code:

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

I've got a lot of other similar messages suggesting that iterator's arithmetic operators accept and return int . Why not size_t ? Fixing all these messages is a pain, and doesn't make my code prettier!

I've got a lot of other similar messages suggesting that iterator's arithmetic operators accept and return int .

Not necessarily int . It's the (signed) difference_type defined by the iterator type's iterator_traits . For most iterator types, this defaults to ptrdiff_t .

Why not size_t ?

Because arithmetic needs to work correctly with signed values; one would expect it + (-1) to be equivalent to it - 1 .

It allows for things like it += index; where index can be both positive or negative (according to some logic).

Comparing with the following:

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

Which would be needed if we could only pass unsigned values.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM