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,而后者将始终重新分配)。
不,不是。这是不可能的,因为 opBinary
和 opOpAssign
可能有不同的语义:
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)
}
例如,假设 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,而后者将始终重新分配)。
不,不是。这是不可能的,因为 opBinary
和 opOpAssign
可能有不同的语义:
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)
}