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?

questionAnswers(4)

yourAnswerToTheQuestion