1

コンパイル時に非推奨 (Suse Linux 12.2 上の GCC 4.7.1)を使用std::auto_ptrして醜い警告を出すコードがいくつかあります。std::auto_ptr

だから私は次のことを試しました(州std::unique_ptrが適切な同等物であるべきであるというソースを見つけたので)

template<typename T>
struct AutoPtr
{
#ifdef COMPILE_FOR_CX11
    typedef std::unique_ptr<T> Type;
#else
    typedef std::auto_ptr<T> Type;
#endif
};

std::auto_ptr<T>への参照をに置き換えましAutoPtr<T>::Typeたが、このオプションを使用するとコンパイル エラーが発生しました。

これらのコードのようなものを使用したいと確信std::auto_ptrしており、その原因と欠陥については認識しています。私が得たエラーstd::unique_ptrは、使用時の構築の問題と相関しているようです。

補足として: 構築に使用される最終的なクラスは の継承型ですT。コードは次のようになります。

class MockClass;

class Client
{
public:
    Client();
    Client(const Client& rhs);

private:
    mutable AutoPtr<MockClass>::Type embeddedMock;
};

Client::Client()
: embeddedMock(new ::testing::NiceMock<MockClass>())
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Getting errors here!
{
}


Client::Client(const Client& rhs)
: embeddedMock(rhs.embeddedMock)
{
}

では、ここで使用できる C++11 セットの完全に準拠したスマート ポインターは何ですか?

4

1 に答える 1

9

unique_ptrの C++11 代替機能ですauto_ptr。ただし、auto_ptrコピー時の所有権の譲渡セマンティクスunique_ptrがあり、所有権を明示的に譲渡する必要があるため、ドロップインの代替品ではありません。あなたがこのようなものを持っているとき:

auto_ptr<Foo> x(new Foo());
// ...
auto_ptr<Foo> y = x;
// ...
bar( y ); // copies y into bar(), transferring ownership

. . . を使用するには、所有権移転サイトunique_ptrに追加する必要があります。move()

unique_ptr<Foo> x(new Foo());
// ...
unique_ptr<Foo> y = move(x);
// ...
bar( move(y) );

編集:

発生している特定のエラーがわからないと、既定のコンストラクターがコンパイルに失敗している理由を判断するのは困難です。ただし、コピー コンストラクターは、追加しunique_ptrない限りコンパイルに失敗するはずです。move

于 2013-07-12T21:24:28.497 に答える