I just saw some C++ code like this. It was using a condition to decide whether to walk forward or backward through a std::vector
. The compiler doesn't complain, but I thought size_t
was unsigned. Is this dangerous?
vector<int> v { 1,2,3,4,5 };
bool rev = true;
size_t start, end, di;
if (rev) {
start = v.size()-1;
end = -1;
di = -1;
}
else {
start = 0;
end = v.size();
di = 1;
}
for (auto i=start; i!=end; i+=di) {
cout << v[i] << endl;
}
Best Answer
It's well defined to use unsigned integers (and
size_t
is unsigned) this way, with wraparound: that behavior is guaranteed by the standard, as opposed to with signed integers, where it's not guaranteed by the standard.It is however needlessly clever.
As a general rule, to avoid problems due to implicit wrapping promotions to unsigned, use unsigned integers for bit-level stuff, use signed integers for numbers. Where you need a signed integer corresponding to
size_t
there'sptrdiff_t
for you. Define ann_items
function with signed result, e.g.and you're set to go, no more sillywarnings from the compiler.
Instead of the too clever given code
do e.g.