2

Nicolai Josuttisは、彼の著書「The C ++ Standard Library-A Tutorial and Reference」の中で、44ページに次の段落を書いています。

auto_ptrsの概念によれば、定数参照を使用して所有権を関数に移すことができます。これは非常に危険です。定数参照としてオブジェクトを渡したときに、オブジェクトが変更されないことを通常は期待しているからです。幸いなことに、auto_ptrsの危険性を低くする設計上の決定が遅れました。いくつかのトリッキーな実装手法では、所有権の譲渡は一定の参照では不可能です。実際、定数auto_ptrの所有権を変更することはできません:…

一定の参照で所有権を変更できない場合、上記の「これは非常に危険です」および「それほど危険ではない」という表現はなぜですか?

4

1 に答える 1

5

コメントの要約:

「これは非常に危険です」とは、std::auto_ptr<>(所有権を譲渡する)コピーコンストラクターがconst参照引数をとった場合を指します。これは、const-correctnessの完全な違反です。

「危険性が低い」とは、コピーコンストラクター(現在は非定数参照を取得)が所有権をまったく譲渡できないという事実を指します。これはまだ危険ですが、コピーコンストラクタがconst参照を取得したときほど危険ではありません。

のこの側面はstd::auto_ptr<>、一般的に使用できないほど壊れていると見なされる範囲で、クラスの欠陥と一般的に見なされます。したがって、boost::scoped_ptr<> boost::shared_ptr<>主にC ++ 03の「実際の」スマートポインタと見なされ、C ++ 11ではstd::auto_ptr<>完全に非推奨にstd::unique_ptr<>なりました(C ++ 17では完全に削除されました)。


更新: Boost 1.57以降、Boost.MoveライブラリはC ++ 03エミュレーションを提供するようになりました。これは、 :std::unique_ptr<>ではなく使用する必要があります。boost::scoped_ptr<>boost::movelib::unique_ptr<>

于 2012-02-21T17:17:29.647 に答える