Подтвердить что ты не робот

Как shared_ptr может предложить noexcept присваивание?

Как std::shared_ptr предложить noexcept operator=? Конечно, если этот shared_ptr является последним, тогда он должен будет уничтожить его содержимое, и он не может гарантировать, что деструктор этого объекта не выбрасывает, или пользовательский деаэратор, используемый первоначально, не бросает.

4b9b3361

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