In [util.smartptr.shared.const] p8 the shared_ptr constructors taking a deleter say:
The copy constructor and destructor of D shall not throw exceptions.
It's been pointed out that this doesn't forbid throwing moves, which makes it difficult to avoid a leak here:
struct D { D() = default; D(const D&) noexcept = default; D(D&&) { throw 1; } void operator()(int* p) const { delete p; } }; shared_ptr<int> p{new int, D{}};
"The copy constructor" should be changed to reflect that the chosen constructor might not be a copy constructor, and that copies made using any constructor must not throw.
N.B. the same wording is used for the allocator argument, but that's redundant because the Allocator requirements already forbid exceptions when copying or moving.