1

-std = c ++ 0xオプションを使用して、gcc4.4.6でunique_ptrを有効にしました。それは非常にうまく機能しているようで、まさに私が必要としていたものです-カスタム削除機能を備えたスコープポインター。

しかし、私は問題に気づきました。

typedef std::unique_ptr<X> XPtr;

XPtr ptr1(new X);
XPtr ptr2(new X);

std::cout << "ptr1 points to " << ptr1 << std::endl;
std::cout << "ptr2 points to " << ptr2 << std::endl;

表示:ptr1は1を指しますptr2は1を指します

ostreamインサーターがbool値を挿入していると思います。

以下はそれを修正しますが、これが標準ライブラリの一部であってはならないのではないかと思います。

template<typename Target, typename Deleter>
std::ostream & operator <<( std::ostream & out, const std::unique_ptr<Target, Deleter> & value)
{
    // output the raw pointer
    out << value.get();
    return out;
}

したがって、問題は次のとおりです。これは、gccでの現在のunique_ptr実装の制限ですか、それともunique_ptrに期待しすぎていますか?

4

2 に答える 2

4

これは、gcc 4.4.6 に同梱されているライブラリのバグのようです。変換は

explicit operator bool() const noexcept;

にポインターを挿入しようとしてトリガーされるべきではありません ostream。これによりコンパイル エラーが発生するはずであり、gcc 4.7 で発生するのとまったく同じです。

編集: gcc 4.4 は明示的な変換演算子をサポートしていなかったため、当時は機能していませんでした。C++11 を実際に使用するには、新しい gcc バージョンを入手する必要があります。

于 2012-05-10T15:53:44.393 に答える