问题
The standard doesn't enforce noexcept on move constructors. In what circumstances is it acceptable/neccesary for a move constructor to throw?
回答1:
When you really have no choice. Most of the time your move constructor should be noexcept
. And they are by default.
See this: http://www.codingstandard.com/rule/12-5-4-declare-noexcept-the-move-constructor-and-move-assignment-operator/
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.
回答2:
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...
};
来源:https://stackoverflow.com/questions/26922113/when-should-i-declare-a-move-constructor-without-noexcept