4

私は次のものを持っているとしましょう:

std::unique_ptr<A> pA;
pA(new A);

この複雑な例では、 の動作はどうあるべきpA(new A);でしょうか?

私が知る限り、MSVC2010 では、void operator()(T*) const;from default_delete が返された直後に呼び出されnew、ポインターをすぐに削除します。g++(4.7.0) ではno match for call (std::unique_ptr<A>)(A*)エラーが発生しました。

4

2 に答える 2

6

コードはコンパイルされません。 std::unique_ptrオーバーロードしませんoperator()

Visual C++ 2011 Developer Preview は、コードを正しく拒否します。Visual C++ 2010 は、実装にバグがあるstd::unique_ptrため、コードのみを受け入れます。

于 2011-12-11T22:51:55.370 に答える
1

MSVC は、 に対してステートレス デリーター最適化を採用していunique_ptrます。つまり、empty-base-class-optimization を利用し、deleter から継承するだけです。残念ながら、継承は です。これが、オーバーロードされたファンクターpublicにアクセスできる理由です。operator()default_delete

于 2011-12-11T22:56:32.713 に答える