Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;带值引用的运算符重载_C++_C++11_Operator Overloading - Fatal编程技术网

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(或显式转换)。