在重新分配时,在确定是否移动或复制元素之前,矢量似乎会检查移动构造函数是否标记为noexcept。默认移动构造函数是否定义为noexcept?我看到了以下文档,但没有说明这一点。http://en.cppreference.com/w/cpp/language/move_constructor
隐式声明的移动构造函数
如果没有用户定义的移动 构造函数是为类类型(struct,class或union)提供的, 并且以下所有情况都是正确的:没有用户声明的副本 构造函数没有用户声明的复制赋值运算符 没有用户声明的移动赋值运算符没有 用户声明的析构函数是隐式声明的移动构造函数 由于下一节中详述的条件,未定义为已删除 然后编译器将一个移动构造函数声明为内联公共 具有签名T :: T(T&&)A类的类的成员可以拥有 多个移动构造器,例如T :: T(const T&&)和T :: T(T&&)都是。 如果存在一些用户定义的移动构造函数,则用户可能仍然存在 强制生成隐式声明的移动构造函数 关键字默认。
答案 0 :(得分:65)
我认为答案是15.4 / 14(例外规范):
继承构造函数(12.9)和隐式声明的特殊成员函数(子句12)具有异常规范。如果
f
是继承构造函数或隐式声明的默认构造函数,复制构造函数,移动构造函数,析构函数,复制赋值运算符或移动赋值运算符,则其隐式异常 - 规范<当且仅当 exception-specification 允许T
时,/ em>指定type-idT
由f
的隐式定义直接调用的函数;f
允许所有异常,如果它直接调用的任何函数允许所有异常,f
具有异常 - 规范noexcept(true)
,如果它直接调用的每个函数都不允许异常
基本上,它是你的想法,隐含声明的移动构造函数是noexcept
。