November 15, 2012
And if so is it safe. Without the postblit on X there is no issue. With the postblit I get that X.__postblit is not callable, indicating that somehow values are being copied even though my hope was they would not since it is ref val. Unfortunately const ref val is not accepted by the compiler. Assuming I do nothing to val in the loop (in fact I'd like to just cast it to const to guarantee it), is this the way to go?

Thanks
Dan
---------------------
import std.traits;
alias const(X)[string] Map;
struct X {
  this(this) {}
  char[] x;
}

void foo(ref const(Map) m) {
  // FAILS TO COMPILE foreach(key, ref val; m) {
  foreach(key, ref val; cast(DeepUnqual!(typeof(m)))m) {
    pragma(msg, typeof(key));
  }
}

void main() {
  Map map;
  foo(map);
}

template DeepUnqual(T) {
  static if(isAssociativeArray!T) {
    alias Unqual!(Unqual!(ValueType!T)[Unqual!(KeyType!T)]) DeepUnqual;
  } else static if(isDynamicArray!T) {
    alias Unqual!(Unqual!(ArrayElementType!T)[]) DeepUnqual;
  } else static if(isPointer!T) {
    alias Unqual!(PointerTarget!T) * DeepUnqual;
  } else {
    alias Unqual!T DeepUnqual;
  }
}