19

私はそれを発見して驚いた。is_swappable<T>そしてそれis_nothrow_swappable<T>は新しいC++11type_traitsメタ関数の中にはない。これらは、テンプレートの伝播noexceptや、テンプレートの非スロースワップを実装できるかどうかを判断するのに非常に役立ちます。

libc ++は、独自の内部バージョンをロールします。type_traitsのバージョン__is_swappableおよび__is_nothrow_swappableを参照してください。これらは、内部で広範囲に使用されますが、ライブラリの外部では使用できません。

私は個人的なプロジェクトのためにこれらの自分のバージョンを一緒に組み合わせることになりました。それはうまくいくようですが、どういうわけか壊れていると確信しています。

これらの2つが非常に重要であると思われるため、これら2つがないことに興味があります。この機能はC++11の標準化プロセスで考慮されましたか、それとも含まれていなかったのは見落としでしたか?それが考慮された場合、それが最終的な標準に組み込まれなかった原因は何ですか(時間の不足、実装の問題など)?これについて議論している欠陥レポートや進化の論文はありますか?これらの特性をC++1Yに組み込む計画はありますか?認められた「正しい」バージョンはどこかにありますか?

4

1 に答える 1

14

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
于 2013-01-23T16:05:57.590 に答える