作者:一恒谢永泰_661 | 来源:互联网 | 2023-05-24 08:20
我在下面的代码背后有点好奇的机制:
int[3] a1 = [ 1 , 2 , 3 ];
int[3] a2 = [ 1 , 2 , 3 ];
int[3] result = a1[] + a2[];
foreach (i; result)
writeln(i);
结果是2,4,6.在C++中,我们不得不重载'+'运算符,以便使用两个向量来实现它或使用std :: transform.我查了一下array(std_array.html)的实现文档.我无法找到'+'的任何重载,我认为D通过检查数据整数类型或其他东西来管理这个,但我只是在猜测.
有人可以解释这实际上是如何工作的吗?
1> Adam D. Rupp..:
它是语言本身的一部分:
http://dlang.org/arrays.html#array-operations
只要给出结果,实现可以做不同的事情,这为自动优化提供了足够的灵活性.目前,在查看反汇编时,它会编译为函数调用,类似于操作符重载,只是自动完成.
尝试它会给出一个很好的错误信息:`错误:无效的数组操作'a2 [] + = a1 []'因为Foo不支持必要的算术运算.如果你为plus添加一个重载:`Foo opOpAssign(string op)(Foo rhs){return Foo(); 然后它编译.它仍然编译成一个自动插入的函数调用:`arraySliceSliceAddass_S1b3Foo`(mangle to English:array slice add assign for a struct name b.Foo - 我的文件名为bd,例如).此函数也是自动生成的,其实现是对所有成员的循环,调用重载函数.