17

vector負のインデックスを使用してインデックスを作成しようとしました。メンバー関数は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 intindex値は上記の例にあるため-1、暗黙的に変換されindexます4294967295(つまり、unsigned int型の最大値)。この値はメンバー関数に渡され、例外vector::at()がスローされます。out_of_range

つまり、この例外がスローされるのは、vector::at()メンバー関数がindexがゼロ未満であることを認識しているためではなく、暗黙的に変換されたindexがの現在のサイズよりも大きいためvectorです。これは正しい説明ですか?

4

1 に答える 1

13

はい、それは正しい説明です。(ただし、通常は、指定されていない符号なし整数型(通常はシステム上のポインタのビット幅)を取ります。atシステム上での使用は許可されていますが、標準では義務付けられていません。32ビットと64ビットが一般的です。 )。vector::size_typestd::size_tunsigned intunsigned intsize_t

余談ですが、符号なしから符号付きへの変換には注意してください。標準では、負の値に対して符号付き->符号なし->符号付きのラウンドトリップである必要はなく、一部のコンパイラは予期しない方法で積極的に最適化します。

于 2013-03-02T14:46:06.133 に答える