Я столкнулся с любопытной проблемой, связанной с оценкой выражений:
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) будет оценена после вызова buy_index, так что i, j будет обновлено. это кажется правильным, я проверен в отладчике. однако для некоторых типов матриц, в частности тех, которые должны приводить 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
в стеке трассировки отладчика выглядит так:
- i = 1 при входе в operator () // все в порядке
- i = 0 после финиша от by_index // окей
- i = 1 при входе в matrix :: operator () // не верно, должно быть 0