通过引用,源在操作过程中被修改
Pass by reference, source being modified mid-operation
我正在编写一个程序,通过高斯消去法求解矩阵形式的方程组。然而,我遇到了一个有趣的问题:如果我的算术运算符通过引用,那么行的规范化会给出不正确的结果。
在我的实现中,矩阵由多个矢量组成,所以行运算只是矢量运算。以下是相关功能:
矢量:
T& operator[] (const int i);
const T& operator[] (const int i) const;
Vector<T>& operator/=(const T& rhs);
template<class T>
Vector<T>& Vector<T>::operator/=(const T& rhs)
{
if (rhs == 0)
{
throw DivideByZeroException();
}
for (int i = 0; i < _size; ++i)
{
_data[i] /= rhs;
}
return *this;
}
矩阵:
Vector<T>& operator[] (const int i);
const Vector<T>& operator[] (const int i) const;
(这样,单个[]用于访问一行,双[][]用于访问元素。(
下面是导致问题的原因:
mat[i] /= mat[i][i];
这里的问题是,此操作在某个点修改mat[i][i]
,然后使用修改后的值,因为operator/=
使用传递引用。
问题:将运算符(和所有类似运算符(更改为按值传递更好,还是只更改导致问题的行更好?是否假设所有操作符都是参考的,从而使像上面这样的行总体上不好?
实际上,我想我会把我的评论作为一个完整的答案,问题不是来自于/=
运算符的实现,而是很大程度上来自于调用行本身。正如我所说,这不应该给出一个可预测的(法律(结果。因为语言在标准中说得很清楚,并以i = i++ + ++i;
为例说明了这一点。
所以我的建议是,不要试图把这件事作为你对客户的善意的一种特殊姿态,因为这样做的客户违反了比你的课程规范更重要的合同。
相关文章:
- 如何在窗口过程方法中检测击键?
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- 在c++中从包含新操作的python中创建的pb图创建图
- 在C++中使用友元函数操作模板类中的私有变量时会发生错误
- 此操作在C++中通过引用进行修改的开销是多少
- 这个迭代器操作在 C++ 中是未定义的吗?
- 如何添加到由QtConcurrent::map操作的QStringList中?
- 在具有位操作的函数中获得值
- 如何在另一个过程内存中扫描INT值
- 两个 UShorts 之间的操作在 VC2015 中给出了一个 int
- 在过程出口中打破视觉工作室
- 此数组操作在C++中如何工作
- OPNET:在OPNET的过程模型中写了一个函数,但有错误
- 赋值操作在C中隐式计算为什么布尔值
- 找不到指定的过程.(HRESULT中出现异常:0x8007007F)
- C++使用逐位操作从图像中提取字符
- 使用 std::remove_pointer 等操作在模板中构建派生类型
- 如何使用中间规则操作在野牛中创建短路评估
- 构造函数中对整数数组的memcpy()操作在C++中给出了意外的输出