默认的Move构造函数是否定义为noexcept?
看起来,一个向量将检查移动构造函数是否被标记为noexcept,然后决定在重新分配时是移动还是复制元素。 默认的移动构造函数是否定义为noexcept? 我看到下面的文档,但没有指定这个。 http://en.cppreference.com/w/cpp/language/move_constructor
隐式声明的移动构造函数
如果没有为类types(结构体,类或联合体)提供用户定义的移动构造函数,并且以下所有条件都成立:没有用户声明的复制构造函数,则没有用户声明的复制赋值运算符用户声明的移动赋值运算符没有用户声明的析构函数隐式声明的移动构造函数未被定义为删除由于下一节中详细说明的条件,那么编译器将声明一个移动构造函数作为它的类的内联公共成员签名T :: T(T &&)一个类可以有多个移动构造函数,例如T :: T(const T &&)和T :: T(T &&)。 如果存在一些用户定义的移动构造函数,则用户仍然可以强制生成隐式声明的移动构造函数,其关键字为default。
我认为答案是15.4 / 14(exception规格):
一个inheritance构造函数(12.9)和一个隐式声明的特殊成员函数(12)有一个exception规范 。 如果
f
是inheritance构造函数或隐式声明的默认构造函数,复制构造函数, 移动构造函数 ,析构函数,复制赋值运算符或移动赋值运算符,则它的隐式exception规范指定typesT
当且仅当T
被由f
的隐式定义直接调用的函数的exception规范 ;f
允许所有exception,如果它直接调用的任何函数允许所有exception,并且f
具有exception规范noexcept(true)
如果它直接调用的每个函数都不允许exception。
基本上,它是你所想的,隐式声明的移动构造函数在noexcept
时候都是不可以的。