is_swappable<T>
is_nothrow_swappable<T>
C++11では提案されませんでした。これが、C++11に含まれていない主な理由です。つまり、提案されなければ何も入りません。
では、なぜこれらは提案されなかったのでしょうか。
個人的な経験から言えば、私が実装しておらず、有用だと思ったものは何も提案しません。また、libc ++用に実装しましたが、C++11が公開される前は実装していませんでした。私には、C++11でそうするための時間とツールがありませんでした。私の最善の推測は、これは他の誰にも当てはまるということです。
これらがお役に立ててうれしいです。 あなたは次のC++標準のためにそれらを提案する人かもしれません!真剣に!君の力が必要なんだ!
アップデート
に応答して:
ただし、これは、移動コンストラクターと代入演算子の観点からスワップが実装されている場合にのみ機能するため、少しハックです。
libc++の実装でどのように動作するかを示すテストは次のとおりです。
#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