Why does sum not work in static arrays?

cym13 via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Dec 6 04:27:49 PST 2015


On Sunday, 6 December 2015 at 12:23:05 UTC, Tim K. wrote:
> Hi! I have the following code:
>
>     int main(string[] argv)
>     {
>         import std.algorithm: sum;
>         import std.stdio: writeln;
>
>         uint[3] a1 = [1, 2, 3];
>         uint[] a2;
>         for (int i = 1; i <= 3; ++i)
>             a2 ~= i;
>
>         writeln("a1: ", sum(a1));
>         writeln("a2: ", sum(a2));
>         return 0;
>     }
>
> This throws the error:
> dummy.d(11): Error: template std.algorithm.iteration.sum cannot 
> deduce function from argument types !()(uint[3]), candidates 
> are:
> /usr/include/dmd/phobos/std/algorithm/iteration.d(3916):        
> std.algorithm.iteration.sum(R)(R r) if (isInputRange!R && 
> !isInfinite!R && is(typeof(r.front + r.front)))
> /usr/include/dmd/phobos/std/algorithm/iteration.d(3927):        
> std.algorithm.iteration.sum(R, E)(R r, E seed) if 
> (isInputRange!R && !isInfinite!R && is(typeof(seed = seed + 
> r.front)))
>
>
> So a dynamic array works just fine. In fact, if I uncomment the 
> line in question the program compiles and outputs the correct 
> value (for a2). Why does "sum" not work on static arrays?
>
>
> Regards

So that you do not shoot yourself in the foot too easily. A 
static array is a value type so it is passed by value to 
functions. If you pass a 1M array to a function... well, I guesse 
you don't want to do that.

The solution is to slice it:   a1[].sum;   That way you avoid the 
problem.


More information about the Digitalmars-d-learn mailing list