怎么能std::shared_ptr
提供noexcept
operator=
?当然,如果这shared_ptr
是最后一个,那么它必须销毁其内容,并且不能保证该对象的析构函数不抛出,或者原来使用的自定义删除器不抛出。
3 回答
对我来说看起来像是一个缺陷,尽管我在活动问题列表中找不到一个(尽管 #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
工作方式,否则这一定是一个错误。
或者,它可能只是意味着赋值运算符仅在基础对象类型和删除器类型都不会引发破坏时才可用,尽管即使在这种情况下,标准措辞中缺乏任何信息性注释让我认为这不太可能.
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.
重要的是要注意reset()
(不带参数)并且swap
也被声明nothrow
。
此外,如果我们看一下boost::shared_ptr
它提供了相同的声明,除了它还声明它是析构函数never throws
,std::shared_ptr
因为某些原因没有。
据我了解,它的意思不是“我保证~T() 不会抛出”,而是“我禁止~T() 抛出并希望你知道你在做什么”。