22

怎么能std::shared_ptr提供noexcept operator=?当然,如果这shared_ptr是最后一个,那么它必须销毁其内容,并且不能保证该对象的析构函数不抛出,或者原来使用的自定义删除器不抛出。

4

3 回答 3

9

对我来说看起来像是一个缺陷,尽管我在活动问题列表中找不到一个(尽管 #2104 是相似的)。

  • Per [C++11: 20.7.2.2.3/1],分配被定义为等价于shared_ptr(r).swap(*this);

  • 但per [C++11: 20.7.2.2.2]~shared_ptr本身不是noexcept

除非我误解了noexcept工作方式,否则这一定是一个错误。

或者,它可能只是意味着赋值运算符仅在基础对象类型和删除器类型都不会引发破坏时才可用,尽管即使在这种情况下,标准措辞中缺乏任何信息性注释让我认为这不太可能.

于 2012-12-08T15:08:01.103 回答
4

According to the isocpp forums, shared_ptr simply assumes that the deleter will not throw, and otherwise is UB. This would mean that the real defect is that shared_ptr's destructor is not marked as nothrow.

于 2012-12-08T17:39:49.680 回答
2

重要的是要注意reset()(不带参数)并且swap也被声明nothrow

此外,如果我们看一下boost::shared_ptr它提供了相同的声明,除了它还声明它是析构函数never throwsstd::shared_ptr因为某些原因没有。

据我了解,它的意思不是“我保证~T() 不会抛出”,而是“我禁止~T() 抛出并希望你知道你在做什么”。

于 2012-12-08T16:58:17.837 回答