どのようstd::shared_ptrに提供できますnoexcept operator=か? 確かに、これshared_ptrが最後のものである場合は、その内容を破棄する必要があり、そのオブジェクトのデストラクタがスローしないこと、または最初に使用されたカスタム デリーターがスローしないことを保証できません。
3 に答える
私には欠陥のように見えますが、アクティブな問題のリストには見つかりません(#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、これはエラーに違いありません。
あるいは、代入演算子は、基礎となるオブジェクト型も削除型も破壊をスローしない場合にのみ使用できることを意味する可能性がありますが、そのようなシナリオでも、標準的な文言に有益なメモがないため、これはありそうにないと思います.
isocpp フォーラムによると、shared_ptr単にデリータがスローしないと想定しており、それ以外の場合は UB です。これは、実際の欠陥は、shared_ptrのデストラクタが非スローとしてマークされていないことを意味します。
reset()(パラメータなしで) andswapも宣言されていることに注意することが重要nothrowです。
また、見てみるとboost::shared_ptr、同じ宣言が提供されていますが、デストラクタであることも宣言されてnever throwsいますがstd::shared_ptr、何らかの理由でそうではありません。
私が理解している限りでは、それが意味するのは「~T() がスローされないことを保証する」ではなく、「~T() がスローされることを禁止し、あなたが何をしているのかを知ってほしい」ということです。