【发布时间】:2015-04-24 00:27:07
【问题描述】:
特别是与std::vector 相关,重要的是类型可以noexcept 尽可能移动。
所以当声明一个移动构造函数= default就像在
struct Object1
{
Object1(Object1 &&other) = default;
};
std::is_nothrow_move_constructible<Object1>::value 将是 true,因为 Object1 的每个成员(此处为 0)都不是抛出移动可构造的,答案是 here。
但是,如果只声明移动复制构造函数,然后像下面的代码那样定义 = default,会发生什么?
struct Object2
{
Object2(Object2 &&other);
};
Object2::Object2(Object2 &&other) = default;
使用 g++ 4.9.2 std::is_nothrow_move_constructible<Object2>::value 是 false,我必须将声明和定义都标记为 noexcept 以使其成为 true。
现在我感兴趣的是实际规则是什么。
特别是因为Effective Modern C++ (Scott Meyers) 中的第 22 项似乎通过建议实现 pimpl-idiom move 构造函数就像我对Object2 所做的那样给出了错误的建议。
【问题讨论】:
标签: c++ c++11 move-semantics pimpl-idiom noexcept