默认的Move构造函数是否定义为noexcept?

时间:2013-09-06 08:53:08

标签: c++ c++11 constructor move-semantics

在重新分配时,在确定是否移动或复制元素之前,矢量似乎会检查移动构造函数是否标记为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&&)都是。   如果存在一些用户定义的移动构造函数,则用户可能仍然存在   强制生成隐式声明的移动构造函数   关键字默认。

1 个答案:

答案 0 :(得分:65)

我认为答案是15.4 / 14(例外规范):

  

继承构造函数(12.9)和隐式声明的特殊成员函数(子句12)具有异常规范。如果f是继承构造函数或隐式声明的默认构造函数,复制构造函数,移动构造函数,析构函数,复制赋值运算符或移动赋值运算符,则其隐式异常 - 规范<当且仅当 exception-specification 允许T时,/ em>指定type-id T   由f的隐式定义直接调用的函数; f允许所有异常,如果它直接调用的任何函数允许所有异常,f具有异常 - 规范 noexcept(true),如果它直接调用的每个函数都不允许异常

基本上,它是你的想法,隐含声明的移动构造函数是noexcept