shared_ptr如何提供noexcept赋值?

Pup*_*ppy 22 c++

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

Lig*_*ica 9

看起来像是一个缺陷,虽然不是我能在活动问题列表中找到的(尽管#2104 类似).

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

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

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

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

  • "活动问题列表"链接是核心语言问题列表.这应该在[图书馆问题清单]中(http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html); 我也找不到任何东西. (3认同)
  • 您不能对它们进行条件限制,因为您不知道删除器或对象的基础类型是什么. (2认同)