2

次のようなコードを使用していることが多い場合:

boost::scoped_ptr<TFoo> f(new TFoo);

Bar(f.get());  // call legacy or 3rd party function : void Bar (TFoo *)

さて、スマート ポインターは暗黙の変換演算子を簡単に定義して「生の」ポインター型に戻すことができると思います。これにより、このコードを引き続き有効にすることができ、古いコードの「スマート化」が容易になります。

Bar(f);

しかし、そうではありません - または少なくとも、私が見つけたものではありません。なんで?

4

2 に答える 2

7

IMO の暗黙的な変換は、C++ におけるすべての悪の根源であり、追跡が最も困難な種類のバグの 1 つです。

それらに依存しないことをお勧めします。すべての動作を予測することはできません。

于 2012-12-04T12:15:03.680 に答える
2

誤ってスマート ポインターをバイパスするのは非常に簡単だからです。たとえば、次のように書くとどうなりますか:-

delete f;

あなたの例では、悪いことが起こります。関数は似ている可能性があり、スマートポインターを壊すポインターの独自のコピーを保存する場合があります。少なくとも get を呼び出すと、「これは安全か?」と考えるようになります。

于 2012-12-04T12:53:43.907 に答える