Follwing code should compile: struct S { void opAssign(T)(auto ref T rhs) if (!__traits(isRef, rhs)) {} } static assert(hasElaborateAssign!S); Because hasElaborateAssign!T checks is(typeof(T.init.opAssign(T.init))), but T.init is always lvalue, so S cannot pass its test.
https://github.com/D-Programming-Language/phobos/commit/5fc6ec7b372fc6901795367e723a016ad631b199