似乎一个向量会检查move构造函数是否标记为noexcept,然后再决定重新分配时是移动还是复制元素。默认的移动构造函数是否定义为noexcept?我看到了以下文档,但它没有指定这一点。http://en.cppreference.com/w/cpp/language/move_constructor
隐式声明移动构造函数
如果没有为类类型(struct,类或联合),并且以下所有都是真的:没有用户声明的复制构造函数没有用户声明的复制赋值运算符没有用户声明的移动赋值运算符没有用户声明的析构函数隐式声明的移动构造函数由于下一节详述的条件没有被定义为已删除,那么编译器将声明一个移动构造函数为其类的内联公共成员,其签名为t::t(t&&)类可以有多个移动构造函数,例如t::t(const t&&)和t::t(t&&)。如果存在某些用户定义的move构造函数,则用户仍可能强制使用关键字default生成隐式声明的move构造函数。
我想答案是15.4/14(异常规格):
继承构造函数(12.9)和隐式声明的特殊成员函数(第12条)有一个异常规范。如果f
是继承构造函数或隐式声明的默认构造函数、copy构造函数、move构造函数、析构函数、copy赋值运算符或move赋值运算符,则其隐式异常规范指定类型-idt
当且仅当f
的隐式定义直接调用的函数的异常规范允许t
;f
允许所有异常,如果它直接调用的任何函数都允许所有异常,则它允许所有异常;如果它直接调用的每个函数都不允许异常,则f
具有异常规范noexcepting(true)
。
基本上,它做您想做的事情,并且隐式声明的move构造函数在任何时候都是noexcept
。