式の評価に関する興味深い問題に遭遇しました:
reference operator()(size_type i, size_type j) {
return by_index(i, j, index)(i, j); // return matrix index reference with changed i, j
}
matrix& by_index(size_type &i, size_type &j, index_vector &index) {
size_type a = position(i, index); // find position of i using std::upper_bound
size_type b = position(j, index);
i -= index[a];
j -= index[b];
return matrix_(a,b); // returns matrix reference stored in 2-D array
}
i, j が更新されるように、matrix(i,j) は buy_index の呼び出し後に評価されると思いました。これは正しいようです。デバッガで確認しました。ただし、一部のタイプのマトリックス、特に size_type を別のもの (int など) にキャストする必要があるタイプでは、by_index の更新が失われます。コードを変更すると、問題がわずかに解消されます。
reference operator()(size_type i, size_type j) {
matrix &m = by_index(i, j, index);
return m(i, j);
}
最初のオペレーターがなぜ不正行為をするのか知っていますか? ありがとう
機能するプロトタイプと機能しないプロトタイプ
inline reference operator () (size_t i, size_t j); // ublas, size_type is std::size_t
reference operator () (int i, int j); // other prototype, size_type is int
デバッガーのバックトレース スタックでは、次のようになります。
- operator() へのエントリ時に i = 1 //わかりました
- by_index からの終了後、i = 0 //わかりました
- i = 1 マトリックスへのエントリ:: operator() //正しくありません。0 にする必要があります