Explanation of constraints:

With unstable swapping, `quickSortImpl` is used, which uses `swapAt`, which needs either swappable or assignable elements.
https://github.com/Poita/phobos/blob/ba86527c0447434eaab26233f64367c5303ed133/std/algorithm.d#L8090

With stable swapping, TimSort is used, which explicitly checks its requirements (only assignability is needed)
https://github.com/Poita/phobos/blob/ba86527c0447434eaab26233f64367c5303ed133/std/algorithm.d#L8166