auto + Top-level Const/Immutable

Jonathan M Davis jmdavisProg at gmx.com
Tue Dec 20 09:46:29 PST 2011


On Tuesday, December 20, 2011 09:23:31 dsimcha 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?

Assuming that the assignment can still take place, then making auto infer non-
const and non-immutable would be an improvement IMHO. However, there _are_ 
cases where you'd have to retain const - a prime example being classes. But 
value types could have const/immutable stripped from them, as could arrays 
using their tail-constness.

- Jonathan M Davis


More information about the Digitalmars-d mailing list