在D语言中添加两个数组的机制

Kad*_*mir 1 arrays d

我在下面的代码背后有点好奇的机制:

int[3] a1 = [ 1 , 2 , 3 ];
int[3] a2 = [ 1 , 2 , 3 ];
int[3] result = a1[] + a2[];
foreach (i; result)
    writeln(i);
Run Code Online (Sandbox Code Playgroud)

结果是2,4,6.在C++中,我们不得不重载'+'运算符,以便使用两个向量来实现它或使用std :: transform.我查了一下array(std_array.html)的实现文档.我无法找到'+'的任何重载,我认为D通过检查数据整数类型或其他东西来管理这个,但我只是在猜测.

有人可以解释这实际上是如何工作的吗?

Ada*_*ppe 6

它是语言本身的一部分:

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,例如).此函数也是自动生成的,其实现是对所有成员的循环,调用重载函数. (2认同)