Ответ 1
is_swappable<T>
и is_nothrow_swappable<T>
никогда не были предложены для С++ 11. Это основная причина, по которой они не находятся на С++ 11. То есть ничего не происходит, если не предлагается.
Так почему же они не предлагались?
Говоря из личного опыта, я не предлагаю ничего, что я не реализовал и нашел полезным. И хотя я реализовал их для libС++, я не делал этого до публикации С++ 11. У меня просто не было времени и инструментов для С++ 11. Мое лучшее предположение - это то, что это относится к любому другому.
Рад, что вы нашли их полезными. Вы могли бы предложить их для следующего стандарта С++! Шутки в сторону! Нам нужна ваша помощь!
Обновление
В ответ на:
это немного взломать, потому что это работает, только если swap реализуется с точки зрения конструкторов перемещения и операторов присваивания
Здесь показан тест, показывающий, как он работает при реализации libС++:
#include <type_traits>
#include <iostream>
struct A
{
A(const A&);
};
struct B
{
};
void swap(B&, B&);
struct C
{
};
void swap(C&, C&) noexcept;
struct D
{
D(const D&) noexcept;
D& operator=(const D&) noexcept;
};
int main()
{
std::cout << "std::__is_nothrow_swappable<int>::value = "
<< std::__is_nothrow_swappable<int>::value << '\n';
std::cout << "std::__is_nothrow_swappable<A>::value = "
<< std::__is_nothrow_swappable<A>::value << '\n';
std::cout << "std::__is_nothrow_swappable<B>::value = "
<< std::__is_nothrow_swappable<B>::value << '\n';
std::cout << "std::__is_nothrow_swappable<C>::value = "
<< std::__is_nothrow_swappable<C>::value << '\n';
std::cout << "std::__is_nothrow_swappable<D>::value = "
<< std::__is_nothrow_swappable<D>::value << '\n';
}
Какие для меня выходы:
std::__is_nothrow_swappable<int>::value = 1
std::__is_nothrow_swappable<A>::value = 0
std::__is_nothrow_swappable<B>::value = 0
std::__is_nothrow_swappable<C>::value = 1
std::__is_nothrow_swappable<D>::value = 1