std::shared_ptr
如何提供noexcept
operator=
?当然,如果这个shared_ptr
是最后一个,那么它将不得不销毁它的内容,并且它不能保证该对象的析构函数不会抛出,或者最初使用的自定义删除器不会抛出。 / p>
答案 0 :(得分:9)
对我来说看起来像是一个缺陷,虽然我找不到active issues list中的缺陷(虽然#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
的工作方式,否则这一定是错误的。
或者它可能只是意味着赋值运算符仅在底层对象类型和删除器类型都不会被破坏时才可用,尽管在这种情况下,标准措辞中缺少任何信息性注释使我认为这不太可能。
答案 1 :(得分:4)
根据isocpp论坛,shared_ptr
只是假设删除器不会抛出,否则就是UB。这意味着真正的缺陷是shared_ptr
的析构函数没有被标记为nothrow。
答案 2 :(得分:2)
值得注意的是,reset()
(不带参数)和swap
也被声明为nothrow
。
另外,如果我们看一下boost::shared_ptr
它会提供相同的声明,除了它还声明它的析构函数为never throws
std::shared_ptr
由于某种原因没有。
据我了解,这意味着不是“我保证~T()不会抛出”,但是“我强烈地禁止 ~T()抛出并希望你知道你是什么是做”。