D 是否自动将 opBinary 重写为 opOpAssign?

Does D automatically rewrite opBinary to opOpAssign?

例如,假设 T 实现了正确的运算符重载:

T t1, t2, t3;
t3 = t1 + t2; // t3.opAssign(t1.opBinary!"+"(t2)) for sure
t3 = t3 + t2; // rewritten to t3.opOpAssign!"+"(t2) ?

最后一个操作是不是被D优化了?

什么是opOpBinary?您是说 opOpAssign 吗?

不,它没有。例如,附加 (~=) 和连接 (~) 数组是不同的操作(前者在末尾预分配额外的 space,而后者将始终重新分配)。

不,不是。这是不可能的,因为 opBinaryopOpAssign 可能有不同的语义:

struct S
{
    int val = 5;

    S opBinary(string op)(S rhs) if (op == "+")
    {
        return S(val + rhs.val);
    }

    void opOpAssign(string op)(S rhs) if (op == "+")
    {
        val = val - rhs.val;
    }
}

void main()
{
    import std.stdio;

    S s1, s2, s3;
    writeln(s3); // S(5)

    s3 = s3 + s2;
    writeln(s3); // S(10)

    s3.val = 5;
    writeln(s3); // S(5)

    s3 += s2;
    writeln(s3); // S(0)
}