Conceptos de C ++ iguales y asignables

He estado experimentando con conceptos de C ++ recientemente. Estoy probando las definiciones del siguiente documento de Extensiones de rangos:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4569.pdf

Las definiciones y usos deSame me confunden Por razones desconocidas para mí, los autores no dieron una definición explícita. Entonces estoy usando:

template <class T, class U>
concept bool Same()
{
  return std::is_same<T, U>::value;
}

El problema es que el documento da la siguiente definición paraAssignable:

template <class T, class U>
concept bool Assignable()
{
  return Common<T, U>() && requires(T&& a, U&& b) {
    { std::forward<T>(a) = std::forward<U>(b) } -> Same<T&>;
  };
}

No funciona (bajo GCC 6.3): un simpleAssignable<int&, int&&>() la verificación de concepto me dafalse (He verificado que elCommon parte está bien). tengo que cambiarSame<T&> aT& para que parezca que funciona. Lo mismoSame<Type> check también se usa en otros lugares.

Mis preguntas son:

Es mi definición deSame ¿correcto?Por que esSame<T&> utilizado en lugar deT&? ¿Cuáles son las diferencias?

Gracias por cualquier ayuda.

Respuestas a la pregunta(2)

Su respuesta a la pregunta