22

どのようstd::shared_ptrに提供できますnoexcept operator=か? 確かに、これshared_ptrが最後のものである場合は、その内容を破棄する必要があり、そのオブジェクトのデストラクタがスローしないこと、または最初に使用されたカスタム デリーターがスローしないことを保証できません。

4

3 に答える 3

9

私には欠陥のように見えますが、アクティブな問題のリストには見つかりません(#2104 は似ていますが)。

  • ごと[C++11: 20.7.2.2.3/1]に、代入は と同等であると定義されていshared_ptr(r).swap(*this)ます。

  • しかしあたり[C++11: 20.7.2.2.2]~shared_ptrそれ自体はそうではありませんnoexcept

仕組みを誤解していない限りnoexcept、これはエラーに違いありません。

あるいは、代入演算子は、基礎となるオブジェクト型も削除型も破壊をスローしない場合にのみ使用できることを意味する可能性がありますが、そのようなシナリオでも、標準的な文言に有益なメモがないため、これはありそうにないと思います.

于 2012-12-08T15:08:01.103 に答える
4

isocpp フォーラムによると、shared_ptr単にデリータがスローしないと想定しており、それ以外の場合は UB です。これは、実際の欠陥は、shared_ptrのデストラクタが非スローとしてマークされていないことを意味します。

于 2012-12-08T17:39:49.680 に答える
2

reset()(パラメータなしで) andswapも宣言されていることに注意することが重要nothrowです。

また、見てみるとboost::shared_ptr、同じ宣言が提供されていますが、デストラクタであることも宣言されてnever throwsいますがstd::shared_ptr、何らかの理由でそうではありません。

私が理解している限りでは、それが意味するのは「~T() がスローされないことを保証する」ではなく、「~T() がスローされることを禁止し、あなたが何をしているのかを知ってほしい」ということです。

于 2012-12-08T16:58:17.837 に答える