Separate rvalues and lvalues using SFINAE (conditional template instanciation) rather than static if-then-else.

For future reference, the issue was this. Suppose you write in a
function f(T&& t):

  if (is_rvalue<T&&>) { copy t } else { store a reference to t }

And you pass to f an lvalue reference to an object of type T where T has
a deleted copy constructor.

The compiler won't know that, since the if(is_rvalue<T&&>) will fail, t
won't be copied. So it will complain that T has a deleted copy
constructor.

The new method separates "copy t" and "store a reference to t" into 2
overloads of a function. Then the compiler will only consider valid
overloads, and we make them mutually exclusive.
Remove NPC copy constructor