Как 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() бросать и надеяться, что вы знаете, что вы делаем".