In case of array `std.algorithm.copy` uses an array specialization that assumes that that arrays can be bitblt-ed and this assumption is false if array contains elements that can not be bitblt-ed but can be copied by elements.
For examples, a structure with indirections with copy ctor or custom `opAssign` can not be bitblt-ed:
```
struct Foo
{
int[] i;
}
const(Foo)[] cfoo;
Foo[] foo;
cfoo.copy(foo); // doesn't compile because
// 'copy' uses the array specialization:
// foo[] = cfoo[];
```
but
```
struct Foo
{
int[] i;
ref Foo opAssign(const(Foo) other)
{
...
}
}
cfoo.copy(foo); // doesn't compile again because
// `copy` again uses the same array specialization
// foo[] = cfoo[]; <- this fails again
// but should use:
// foreach(idx; cfoo.length)
// foo[idx] = cfoo[idx];
```
That is for array `copy` should detect if it can be bitblt-ed or should be copied by element.