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