auto + Top-level Const/Immutable

Martin Nowak dawg at dawgfoto.de
Tue Dec 20 06:34:32 PST 2011


On Tue, 20 Dec 2011 15:23:31 +0100, dsimcha <dsimcha at yahoo.com> wrote:

> The changes made to IFTI in DMD 2.057 are great, but they reveal another  
> hassle with getting generic code to play nice with const.
>
> import std.range, std.array;
>
> ElementType!R sum(R)(R range) {
>      if(range.empty) return 0;
>      auto ans = range.front;
>      range.popFront();
>
>      foreach(elem; range) ans += elem;
>      return ans;
> }
>
> void main() {
>      const double[] nums = [1, 2, 3];
>      sum(nums);
> }
>
> test.d(8): Error: variable test9.sum!(const(double)[]).sum.ans cannot  
> modify const
> test.d(14): Error: template instance test9.sum!(const(double)[]) error  
> instantiating
>
> Of course this is fixable with an Unqual, but it requires the programmer  
> to remember this every time and breaks for structs with indirection.  
> Should we make `auto` also strip top-level const from primitives and  
> arrays and, if const(Object)ref gets in, from objects?

At a first thought yes. I always end up using 'const/immutable var = exp'  
if I want
the other one and 'auto var = exp' with const pretty often causes troubles.


More information about the Digitalmars-d mailing list