Klaufir
Klaufir

Reputation: 791

When should I declare a move constructor without noexcept?

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

Answers (2)

Xaqq
Xaqq

Reputation: 4386

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.

Upvotes: 6

InsertMemeNameHere
InsertMemeNameHere

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

Related Questions