¿Cómo escribo un tipo de retorno final habilitado para ADL o una especificación sin excepción?

Imagina que estoy escribiendo una plantilla de contenedor o algo así. Y llega el momento de especializarsestd::swap para ello. Como buen ciudadano, habilitaré ADL haciendo algo como esto:

template <typename T>
void swap(my_template<T>& x, my_template<T>& y) {
    using std::swap;
    swap(x.something_that_is_a_T, y.something_that_is_a_T);
}

Esto es muy ordenado y todo. Hasta que quiera agregar una especificación de excepción. Miswap esnoexcept siempre que el intercambio porT esnoexcept. Entonces, estaría escribiendo algo como:

template <typename T>
void swap(my_template<T>& x, my_template<T>& y)
    noexcept(noexcept(swap(std::declval<T>(), std::declval<T>())))

Problema es, laswap allí debe ser el ADL-descubiertoswap ostd::swap. ¿Cómo manejo esto?

Respuestas a la pregunta(4)

Su respuesta a la pregunta