原文
我正在试为类重载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=,或执行操作并交换.
-史蒂夫
谢谢你的详细解释!确实.