¿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?