使用负索引索引std :: vector

enz*_*m83 11 c++ type-conversion implicit-conversion

我试图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;
Run Code Online (Sandbox Code Playgroud)

vector::at()成员函数的签名要求指定的参数是vector<T>::size_type类型,并且此类型unsigned int用于向量,因此编译器应执行从int(index变量的类型)到的隐式转换unsigned int.由于index值是-1在上述例子中,隐式转换index4294967295(即所述的最大值unsigned int型):此值被传递给vector::at()成员函数,其抛出out_of_range异常.

换句话说,没有引发这种异常,因为vector::at()成员函数看到的是,index小于零,而是由于隐式转换index比的当前大小更大vector.这是正确的解释吗?

Yak*_*ont 10

是的,这是一个正确的解释.(除非at采用a vector::size_type,通常std::size_t是一些未指定的无符号整数类型(通常是系统上指针的位宽).它unsigned int允许在系统上,但不是标准强制要求; 32位unsigned int和64位size_t是常见的. )

顺便说一下,请注意无符号到签名的转换:标准不要求它是往返签名 - > unsigned->签署负值,并且一些编译器以意想不到的方式积极优化.

  • `(int)(unsigned)-1 == -1`不一定是真的. (4认同)