schwartzSort with a const key

Ali Çehreli acehreli at yahoo.com
Tue Sep 3 15:57:09 PDT 2013


On 09/03/2013 03:22 PM, bearophile wrote:

 > Currently this code doesn't work, because the B array is const, so B[i]
 > is const:
 >
 >
 > import std.algorithm: schwartzSort;
 > void main() {
 >      auto A = [0, 1, 2];
 >      const B = [10, -20, 30];
 >      schwartzSort!(i => B[i])(A);

The return type of the lambda is deduced as const(int). I think that is 
silly. A copied value type should not preserve the const attribute. (I 
vaguely remember discussions on this topic.)

Explicit return type works:

     schwartzSort!(delegate int (i) => B[i])(A);

Playing along with the compiler and casting away const also works:

     schwartzSort!(i => cast()B[i])(A);

 > }
 >
 >
 > dmd gives:
 >
 > ...\dmd2\src\phobos\std\conv.d(3734): Error: static assert "Don't know
 > how to emplace a const(int) with a const(int)."
 > ...\dmd2\src\phobos\std\algorithm.d(9210):        instantiated from
 > here: emplace!(const(int), const(int))
 > test.d(5):        instantiated from here: schwartzSort!(__lambda2, "a <
 > b", cast(SwapStrategy)0, int[])
 >
 >
 > But the array A is mutable. So is it acceptable for me to ask in
 > Bugzilla this code to work?

I would think so but I think this issue may already be in bugzilla.

 >
 > Bye,
 > bearophile

Thanks,
Ali



More information about the Digitalmars-d-learn mailing list