我遇到一个有趣的问题,涉及表达式的评估:
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
在调试器的回溯堆栈中,看起来是这样的:
- 进入 operator() 时 i = 1 //没问题
- 从 by_index 完成后 i = 0 //没问题
- 进入 matrix::operator() 时 i = 1 //不对,应该是 0