似乎在重新分配元素时,向量会检查移动构造函数是否被标记为noexcept,然后决定是移动还是复制元素。默认的移动构造函数被定义为noexcept吗?我看到了下面的文档,但它没有指定这一点。http://en.cppreference.com/w/cpp/language/move_constructor
隐式声明的移动构造函数:
如果结构体、类或联合体的类型没有提供用户定义的移动构造函数,并且以下所有条件都成立:
- 没有用户声明的复制构造函数 - 没有用户声明的复制赋值运算符 - 没有用户声明的移动赋值运算符 - 没有用户声明的析构函数 - 隐式声明的移动构造函数由于下一节详细介绍的条件未定义为已删除
那么编译器将声明一个作为其类的内联公共成员的移动构造函数,其签名为T::T(T&&)。一个类可以有多个移动构造函数,例如T::T(const T&&)和T::T(T&&)。如果存在一些用户定义的移动构造函数,则用户仍然可以使用关键字default强制生成隐式声明的移动构造函数。
- 没有用户声明的复制构造函数 - 没有用户声明的复制赋值运算符 - 没有用户声明的移动赋值运算符 - 没有用户声明的析构函数 - 隐式声明的移动构造函数由于下一节详细介绍的条件未定义为已删除
那么编译器将声明一个作为其类的内联公共成员的移动构造函数,其签名为T::T(T&&)。一个类可以有多个移动构造函数,例如T::T(const T&&)和T::T(T&&)。如果存在一些用户定义的移动构造函数,则用户仍然可以使用关键字default强制生成隐式声明的移动构造函数。
static_assert(std::is_nothrow_move_constructible<MyType>::value, "MyType应为noexcept MoveConstructible");
- Howard Hinnantnoexcept
,才能使隐式特殊成员函数成为noexcept
。这意味着您必须足够努力地标记所有相关函数为noexcept
,这也意味着人为错误的空间很大,对吧? - mucahounique_ptr
)需要审核。 - Kerrek SBvoid T(T &&) = default
,那会怎样呢?如果这个移动构造函数没有被其他条件阻止而隐式声明,比如用户定义了一个复制构造函数,那么我的理解是它的行为完全相同。 - Yan Zhouconstexpr
和noexcept
显式覆盖它们。不过你的例子中有一个多余的void
,所以会导致编译错误。 - Deduplicator