当v大于INT_MAX时,std :: distance(v.begin(),v.end())的结果是什么?

时间:2014-10-16 11:50:55

标签: c++ vector stl iterator integer-overflow

考虑以下代码:

std::vector<char>::size_type size = static_cast<std::vector<char>::size_type>(std::numeric_limits<std::vector<char>::difference_type>::max()) + 1;
std::vector<char> v(size);
std::vector<char>::difference_type diff = std::distance(v.begin(), v.end());

其中 size_type size_t (unsigned int)相同, difference_type ptrdiff_t 相同(签名int)。

如果向量的大小大于 difference_type 的限制, std :: distance 函数会返回负值吗?

1 个答案:

答案 0 :(得分:4)

对于随机访问迭代器类型,distance(a,b)定义为b-a。减去随机访问迭代器有一个前提条件:

  

之前:n类型的difference_type值为a + n == b

因此,如果矢量大小对于difference_type来说太大,那么你就打破了这个前提条件,给出了未定义的行为(可能是否定的结果;也许还有别的东西)。