尤其是在可能的情况std::vector
下,类型noexcept
可移动是很重要的。
所以当声明一个移动构造函数= default
时
struct Object1
{
Object1(Object1 &&other) = default;
};
std::is_nothrow_move_constructible<Object1>::value
将是true
因为每个成员(此处为 0)Object1
是 nothrow-move-constructible,此处已回答。
然而,如果只声明移动复制构造函数,然后= default
像下面的代码那样定义,会发生什么?
struct Object2
{
Object2(Object2 &&other);
};
Object2::Object2(Object2 &&other) = default;
使用 g++ 4.9.2 std::is_nothrow_move_constructible<Object2>::value
,false
我必须将声明和定义都标记为noexcept
make it true
。
现在我感兴趣的是实际规则是什么。特别是因为Effective Modern C++ (Scott Meyers) 中的第 22 项似乎通过建议实现 pimpl-idiom move 构造函数就像我对Object2
.