原文
我正在试为类
重载opOpAssign
.已编译代码
,但似乎不管用.
//已为`值`实现了`二元`操作,我需要`+=,-=,*=,/=`
auto opOpAssign(string op)(Value rhs)
{mixin("return this" ~ op ~ "rhs;");
}
auto opOpAssign(string op)(in ElementType rhs)
{mixin("return this" ~ op ~ "rhs;");
}
在此缺少什么?完整项目在此.
我忘了提,它只与Value
类相关.
此单元测试
失败:
//测试`opOpAssign`
auto g = value(0);
g += value(3);
assert(g.data == 3);
检查OP
.可以肯定,它是"+"
而不是"+="
.所以未保存元素.还有这里没有成员
.
是的,op
是"+"
.你说没有保存?我试重新赋值
给this
,并返回.但失败了.
我想实现如下,但使用"+="
:
auto g = value(0);
g = g + value(3);//在此,应该创建`'g+value(3)'`的新实例,并保存到`'g'`中g += value(3);
该如何实现?
你的代码
只是返回结果值
,
但它不应返回,而应保存
结果到"this"
见重载赋值中的示例
.
我得到一个错误
,但不明白为什么?
auto opOpAssign(string op)(Value rhs)
{this = this + rhs;return this;
}
//错误:`"this"`不是左值,无法修改
也许:
auto opOpAssign(string op)(Value other) {mixin("this.v " ~ op ~ "= other.v;");return this;
}
赋值
对象与复制指针
一样.你可能认为可试重载
赋值,但这是禁止
的:这里
但是,对类类型
,禁止赋值标识
.所有类类型
都是引用语义
,因此默认,赋值标识
会重新绑定左侧
到右侧参数
,这是不可覆盖
的.
但你不是这样做.
相反,你正在试重新赋值this
引用,该引用是局部
的(也是禁止
的).想一想,你的this+rhs
要分配给一个新对象
.
然后,如果成功赋值局部this
参数,则在成员函数
之外会怎样?就不会更新
调用this
的真正引用
!
唯一方法是重新实现op=
,或执行操作
并交换.
-史蒂夫
谢谢你的详细解释
!确实.