どのよう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() がスローされることを禁止し、あなたが何をしているのかを知ってほしい」ということです。