17

我尝试vector使用负索引来索引 a 。成员函数检查指定的vector::at()索引是否在向量的范围内,如果没有发生,out_of_range则抛出异常。

vector<float> array;   // sample vector
array.push_back(0.123);
array.push_back(1.234);
array.push_back(2.345);
array.push_back(3.456);
array.push_back(4.567);

int index = -1;
float f = array.at(index);
cout << f << endl;

成员函数的签名vector::at()要求指定的参数是vector<T>::size_type类型的,而这个类型是unsigned int给向量的,所以编译器应该执行从intindex变量的类型)到的隐式转换unsigned int。由于index-1在上面的例子中,隐式转换index4294967295(即unsigned int类型的最大值):这个值被传递给vector::at()成员函数,它会抛出out_of_range异常。

换句话说,这个异常不是因为vector::at()成员函数看到index小于零,而是因为隐式转换index的大于 的当前大小vector。这是一个正确的解释吗?

4

1 回答 1

13

是的,这是一个正确的解释。(通常at需要 a ,它是一些未指定的无符号整数类型(通常是系统上指针的位宽)。它在您的系统上是允许的,但标准没有强制要求;32 位和 64 位是常见的。 )vector::size_typestd::size_tunsigned intunsigned intsize_t

顺便说一句,注意无符号到有符号的转换:标准不要求它是一个往返有符号->无符号->有符号的负值,并且一些编译器以意想不到的方式积极优化。

于 2013-03-02T14:46:06.133 回答