std综合体设计背后的原因是什么?

std综合体设计背后的原因是什么?,d,phobos,D,Phobos,这意味着我可以有复杂!(不可变浮点),但我永远不能对另一个复杂实例使用它的opBinary函数!(不可变浮点)。那么,为什么std.complex是以这种方式实现的呢 这是opBinary。它调用opOpAssign,这将不适用于不可变的,因此出现错误 unittest { immutable float a = 1.1, b = 1.2; auto c1 = complex(a,b); auto r1 = c1 + c1; // error, not mutable } 我得

这意味着我可以有
复杂!(不可变浮点)
,但我永远不能对另一个
复杂实例使用它的
opBinary
函数!(不可变浮点)
。那么,为什么std.complex是以这种方式实现的呢

这是
opBinary
。它调用
opOpAssign
,这将不适用于
不可变的
,因此出现错误

unittest
{
  immutable float a = 1.1, b = 1.2;
  auto c1 = complex(a,b);
  auto r1 = c1 + c1;  //  error, not mutable
}

我得说这是一只虫子。当然,如果它不是一个bug,那就是一个糟糕的设计。但是看看
opOpAssign
的代码,以及其中有多少代码,我猜他们是在试图避免代码重复,而忘记了考虑到他们所做的不会与
不可变的
一起工作。我建议您。

在这一点上,直接使用opbinary并执行一个整体的
自动oppassign(string op,R)(rz){return(this=this.opbinary!(op)(z));}
将解决所有这些问题。似乎创建
不可变BigInt
也是不可能的。那也是一只虫子吗?@Arlen不知道。这当然值得一个增强请求。但是让用户定义的类型与
不可变的
一起工作通常需要额外的工作,如果定义类型的人没有专门为它编码,那么它很有可能不工作。我的猜测是Don在写
BitInt
时没有想到
不可变的
,但我不知道。
Complex!(CommonType!(T,R)) opBinary(string op, R)(Complex!R z) const
{
    alias typeof(return) C;
    auto w = C(this.re, this.im);
    return w.opOpAssign!(op)(z);
}