Как std::shared_ptr предложить noexcept operator=? Конечно, если этот shared_ptr является последним, тогда он должен будет уничтожить его содержимое, и он не может гарантировать, что деструктор этого объекта не выбрасывает, или пользовательский деаэратор, используемый первоначально, не бросает.
Как shared_ptr может предложить noexcept присваивание?
Ответ 1
Похож на дефект для меня, хотя не тот, который я могу найти в списке активных проблем (хотя # 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, это должно быть ошибка.
В качестве альтернативы это может просто означать, что оператор присваивания можно использовать только тогда, когда ни основной тип объекта, ни тип ликвидатора не уничтожают, хотя даже в таком сценарии отсутствие какой-либо информативной заметки в стандартной формулировке заставляет меня думать, что это маловероятно.
Ответ 2
В соответствии с форумами isocpp, shared_ptr просто предполагает, что делектор не будет бросать, а в противном случае - UB. Это означало бы, что реальный дефект состоит в том, что деструктор shared_ptr не помечен как nothrow.
Ответ 3
Важно отметить, что reset() (без параметров) и swap также объявлены nothrow.
Также, если мы посмотрим на boost::shared_ptr, он предоставит те же объявления, за исключением того, что он также объявляет его деструктором как never throws, который по какой-то причине std::shared_ptr не имеет.
Насколько я понимаю, это означает, что я не гарантирую, что ~ T() не будет бросать ", но" я запретить ~ T() бросать и надеяться, что вы знаете, что вы делаем".