--- void f(int[]) { assert(0); } void f(const int[]) { } void g(int[]) { assert(0); } void g(const(int)[]) { } void h(int) { assert(0); } void h(const int) { } void main() { immutable arr = [5]; f(arr); // Compiles g(arr); // Compiles immutable n = 5; h(n); // Error: ...matches both... } --- If f(arr) and g(arr) compiles, h(n) should compiles too.
int[] is a value with mutable indirection, so copy conversion from immutable int[] to int[] is invalid. Then the callings of f and g with arr are solved with no ambiguous. But, immutable int is a value without mutable indirection, so copy conversion from immutable int to int is *valid*. Then callings of h makes ambiguous with the two const-conversions, immutable int -> int and immutable int -> const int.