You are over thinking it. If *anything* cause `a = *` to do *anything* other than a straight up bit copy, then a will have an elaborate assign, and be marked as such, and that will be the end of that.

```D
struct S
{
    ~this(){}
}

void main() 
{
    static assert(hasElaborateAssign!S);
}
```
So I agree that "destructor" => "must do memcpy", but you are already covered by "destructor" => "elaborate assign".