Вместо того, чтобы объявлять, но не определять шаблон функции, который, вероятно, может вызвать путаницу, я бы написал свою собственную черту типа (которая в любом случае должна быть в стандартной библиотеке). Следуя примеру стандартной библиотеки, я бы определил что-то вроде следующего:
#include <type_traits>
#include <utility>
namespace adl {
using std::swap;
template<typename T, typename U>
struct is_nothrow_swappable : std::integral_constant<
bool,
noexcept(swap(std::declval<T &>(), std::declval<U &>()))
> {
};
} // namespace adl
Мы должны определить наше собственное пространство имен для импорта std :: swap (чтобы не давать его всем), но, конечно, если бы оно было в стандартной библиотеке, в этом не было бы необходимости, потому что они уже могут делать неквалифицированные вызовы поменяться.