我遇到了一个关于表达式评估的奇怪问题:
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
}
我认为 matrix(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() //okay
- 从 by_index 完成后 i = 0 //好的
- i = 1 在进入矩阵时:: operator() //不对,应该是 0