Como eu escrevo um tipo de retorno à direita habilitado para ADL ou nenhuma especificação excet
Imagine Estou escrevendo algum modelo de contêiner ou algo assim. E chega a hora de se especializarstd::swap
por isso. Como bom cidadão, habilitarei a ADL fazendo algo assim:
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);
}
Isto é muito arrumado e tudo. Até que eu queira adicionar uma especificação de exceção. Minhasswap
énoexcept
desde que a troca porT
énoexcept
. Então, eu estaria escrevendo algo como:
template <typename T>
void swap(my_template<T>& x, my_template<T>& y)
noexcept(noexcept(swap(std::declval<T>(), std::declval<T>())))
Problem é, oswap
precisa haver o ADL descobertoswap
oustd::swap
. Como eu manejo isso?