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在上述例子中,隐式转换index是4294967295(即所述的最大值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->签署负值,并且一些编译器以意想不到的方式积极优化.
| 归档时间: |
|
| 查看次数: |
10068 次 |
| 最近记录: |