C++ C++;带值引用的运算符重载
我正在重载向量运算符“-”,并尝试差分引用方法。测试操作员的代码是C++ C++;带值引用的运算符重载,c++,c++11,operator-overloading,C++,C++11,Operator Overloading,我正在重载向量运算符“-”,并尝试差分引用方法。测试操作员的代码是 pos-(norm-bias) 其中pos、norm和bias都是类向量的实例 持续参考工作: Vector operator-(const Vector& v) { 但是,我不明白为什么没有'const'关键字会导致错误:二进制表达式的操作数无效 Vector operator-(Vector& v) { 此外,我不明白为什么带有右值引用的“const Vector&&v”失败了 Vector opera
pos-(norm-bias)
其中pos、norm和bias都是类向量的实例
持续参考工作:
Vector operator-(const Vector& v) {
但是,我不明白为什么没有'const'关键字会导致错误:二进制表达式的操作数无效
Vector operator-(Vector& v) {
此外,我不明白为什么带有右值引用的“const Vector&&v”失败了
Vector operator-(const Vector&& v) {
您没有提供太多信息,因此我将假设所有3个,
pos
,norm
和bias
,都是向量的实例
让我们考虑表达式<代码> POS -(范数偏倚)< /代码>。首先执行括号内的减法运算。您的
操作符-
按值返回一个新的向量。因此,第一次减法的结果现在将尝试绑定到pos.operator-()
。但是右值不能绑定到非常量
引用,并且除非运算符-
通过常量
引用获取其参数,否则代码将不会编译
Vector operator-(const Vector& v);
Vector operator-(Vector&& v);
现在,如果将签名更改为向量运算符-(const Vector&&v)
,则第一次减法(norm-bias)
将失败,因为bias
是左值,它将无法绑定右值引用参数
您可能要做的是提供两个重载,一个采用const
引用,另一个采用右值引用
Vector operator-(const Vector& v);
Vector operator-(Vector&& v);
在第二个操作符中,您可能会从参数中窃取资源,并避免昂贵的操作,如内存分配。如果不知道你的Vector
类包含什么和做什么,就无法判断你是否真的能从这种重载中获益。你没有提供太多信息,所以我假设所有3个pos
,norm
和bias
都是Vector
的实例
让我们考虑表达式<代码> POS -(范数偏倚)< /代码>。首先执行括号内的减法运算。您的
操作符-
按值返回一个新的向量。因此,第一次减法的结果现在将尝试绑定到pos.operator-()
。但是右值不能绑定到非常量
引用,并且除非运算符-
通过常量
引用获取其参数,否则代码将不会编译
Vector operator-(const Vector& v);
Vector operator-(Vector&& v);
现在,如果将签名更改为向量运算符-(const Vector&&v)
,则第一次减法(norm-bias)
将失败,因为bias
是左值,它将无法绑定右值引用参数
您可能要做的是提供两个重载,一个采用const
引用,另一个采用右值引用
Vector operator-(const Vector& v);
Vector operator-(Vector&& v);
在第二个操作符中,您可能会从参数中窃取资源,并避免昂贵的操作,如内存分配。如果不知道您的向量
类包含哪些内容以及它们的作用,就无法判断您是否能够从这种重载中受益。您想要的正确重载是:
Vector operator-(const Vector& v) const;
Vector operator-(Vector&& v) const;
请注意,您还希望将方法本身标记为const
,因为否则,当您使用类似(pos norm)-bias
(无论该示例是否有意义)的表达式时,您将遇到更多问题。从长远来看,如果您真的想利用移动语义,那么实际上您需要做更多的工作,因为左侧也可能是可移动的,并且您希望使用-=
完成操作符集。最后,您可能需要两个成员函数:
Vector& operator-=(const Vector& v);
Vector& operator-=(Vector&& v);
Vector operator-(const Vector& lhs, const Vector& rhs);
Vector operator-(const Vector& lhs, Vector&& rhs);
Vector operator-(Vector&& lhs, const Vector& rhs);
Vector operator-(Vector&& lhs, Vector&& rhs);
和一组四个自由函数:
Vector& operator-=(const Vector& v);
Vector& operator-=(Vector&& v);
Vector operator-(const Vector& lhs, const Vector& rhs);
Vector operator-(const Vector& lhs, Vector&& rhs);
Vector operator-(Vector&& lhs, const Vector& rhs);
Vector operator-(Vector&& lhs, Vector&& rhs);
<>后者可以通过对它自动生成来进一步改进/优化,考虑使用类库或My来帮助您。
通常,您可能需要阅读运算符重载的说明。您需要的正确重载是:
Vector operator-(const Vector& v) const;
Vector operator-(Vector&& v) const;
请注意,您还希望将方法本身标记为const
,因为否则,当您使用类似(pos norm)-bias
(无论该示例是否有意义)的表达式时,您将遇到更多问题。从长远来看,如果您真的想利用移动语义,那么实际上您需要做更多的工作,因为左侧也可能是可移动的,并且您希望使用-=
完成操作符集。最后,您可能需要两个成员函数:
Vector& operator-=(const Vector& v);
Vector& operator-=(Vector&& v);
Vector operator-(const Vector& lhs, const Vector& rhs);
Vector operator-(const Vector& lhs, Vector&& rhs);
Vector operator-(Vector&& lhs, const Vector& rhs);
Vector operator-(Vector&& lhs, Vector&& rhs);
和一组四个自由函数:
Vector& operator-=(const Vector& v);
Vector& operator-=(Vector&& v);
Vector operator-(const Vector& lhs, const Vector& rhs);
Vector operator-(const Vector& lhs, Vector&& rhs);
Vector operator-(Vector&& lhs, const Vector& rhs);
Vector operator-(Vector&& lhs, Vector&& rhs);
<>后者可以通过对它自动生成来进一步改进/优化,考虑使用类库或My来帮助您。
通常,您可能需要读取运算符重载的值。假设bias是左值,它将不会绑定到const Vector&&而不使用std::move(或显式转换)。假设bias是左值,它将不会绑定到const Vector&&而不使用std::move(或显式转换)。