Reputation: 791
The standard doesn't enforce noexcept on move constructors. In what circumstances is it acceptable/neccesary for a move constructor to throw?
Upvotes: 7
Views: 1496
Reputation: 4386
When you really have no choice. Most of the time your move constructor should be noexcept
. And they are by default.
It is especially important to use noexcept for types that are intended to be used with the standard library containers. If the move constructor for an element type in a container is not noexcept then the container will use the copy constructor rather than the move constructor.
Upvotes: 6
Reputation: 2433
The golden rule here is: It depends.
Here is an example where it might make sense:
// A lock_guard template somewhere up here...
template<typename mutex_t>
class shared_lock_guard
{
mutex_t *mtx_ptr;
public:
shared_lock_guard(lock_guard<mutex_t> &&other) :
mtx_ptr{other.mtx_ptr}
{
if(this->mtx_ptr){
// this might throw a system_error
// if the syscall fails or if the
// lock state was corrupted.
//
this->mtx_ptr->shared_relock();
}
other.mtx_ptr = nullptr;
}
// rest of implementation, etc...
};
Upvotes: 4