Imagine que je suis en train d'écrire quelques conteneur de modèle ou de quelque chose. Et vient le temps de se spécialiser std::swap
pour elle. En bon citoyen, je vais activer l'ADL en faisant quelque chose comme ceci:
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);
}
C'est très soigné et tout. Jusqu'à ce que je veux ajouter une spécification d'exception. Mon swap
est noexcept
tant que le swap de T
est noexcept
. Donc, j'avais à écrire quelque chose comme:
template <typename T>
void swap(my_template<T>& x, my_template<T>& y)
noexcept(noexcept(swap(std::declval<T>(), std::declval<T>())))
Problème est, swap
dans il faut l'ADL découverts swap
ou std::swap
. Comment puis-je gérer cela?