When should I declare a move constructor without noexcept?

拟墨画扇 提交于 2021-02-08 13:37:11

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!