On Tuesday, 14 December 2021 at 15:28:30 UTC, Steven
Schveighoffer wrote:
All the other problems you are having are deriving from this
problem.
Not exactly. One of the problems seems to be a genuine bug:
```d
struct S
{
int[] x;
// doesn't even participate here, neither would postblit
this(ref return scope inout S other)
{
x = other.x.dup;
}
void opAssign(ref return scope inout S other)
{
x = other.x.dup;
}
}
void main()
{
immutable(S)[] src = [S([1, 2]), S([3, 4])];
auto dst = new S[src.length];
//dst[0 .. $] = src[0 .. $]; // this fails to compile even
with opAssign defined
// this works:
foreach (i, ref it; dst)
it = src[i];
}
```
Spec: https://dlang.org/spec/arrays.html#array-copying
...contents of the array are the target of the assignment...
Per that wording, slice assignment should perform the equivalent
of that foreach loop (after overlap checks, etc.). It doesn't,
just tries implicit conversion, and fails.
Now, since we have copy ctors, slice assignment should,
ostensibly, attempt to copy-assign elements (i.e. absent
opAssign, try the copy ctor first).