1

Herb Sutter は Exceptional C++ で次のように書いていauto_ptrます。

問題は、auto_ptr のコピーが同等ではないため、auto_ptr がコンテナーに入れることができる型の要件を完全に満たしていないことです。

この本は C++03 に関して書かれていますが、このコードは GCC 4.7.1 で完全にコンパイルされるように見えるため、これがまだ有効かどうか疑問に思います。

#include <vector>

struct Foo
{
    Foo() { }
    Foo( Foo&& ) { }
    Foo( Foo& ) = delete;
    Foo& operator= (Foo&&) { return *this; }
    Foo& operator= (Foo&) = delete;
};

int main()
{
    std::vector<Foo> bar;
    bar.push_back(Foo());
}

しかし、移動可能だがコピー不可能なオブジェクトを受け入れることも、GCC の拡張機能になる可能性があります。私はわかりません。std::vectorオブジェクトの要件は何ですか?

4

1 に答える 1

5

を使用できるようにするには、 23.2.3 [sequence.rqmts] パラグラフ 16 (表 101) に従ってstd::vector<Foo>::push_back()、型をor (23.2.1 [container.requirements.general] パラグラフ 13) にするFoo必要があります。明らかに、モデルを提供するには、おそらく を使用して取得された r 値を使用する必要があります。つまり、移動代入演算子を使用する必要さえありません。すべての標準ライブラリがこの後者の部分を正しく考慮してデリゲートするわけではないと思います.C ++ 2011標準に従って、へのデリゲートは機能しません。型がまたはである必要があるからです。MoveInsertableCopyInsertableMoveInsertablepush_back()std::move(x)std::vector<...>::push_back()insert()insert()insert()MoveAssignableCopyAssignable

残念ながら、名前が改行push_backで分割されているため、検索しようとしても表 101 を指すことができませpush_ん...back()

于 2012-11-22T07:30:06.793 に答える