使用复制和交换分配运算符而不是复制和移动分配运算符的后果

时间:2018-09-14 17:11:38

标签: c++

我指的是this question。为了更容易理解,我应该注意,提到的 C ++ Primer 会告诉读者实施移动操作-如果可能的话-不会抛出异常并指定关键字{ {1}}(如果是)。这导致复制和移动操作的四个声明的集合:

noexcept

或者,如果我们应用复制和交换的习惯用法:

HasPtr(const HasPtr& hp)
HashPtr& operator=(const HasPtr& rhs)
HasPtr(HasPtr&& hp) noexcept
HashPtr& operator=(HasPtr&& rhs) noexcept

就像本书和最初的问题一样,我对低效率的后果很感兴趣:

HasPtr(HasPtr& hp) HasPtr& operator=(HasPtr rhs) // non-reference parameter, copy-and-swap-assigment operator, either calls copy- or move-constructor HasPtr(HasPtr&& hp) noexcept 的情况下,如果拷贝分配构造函数接收到HasPtr作为参数,并且分配内存会引发lvalue异常(如果不是{{1 }} 用来)。因此,我们不应将bad_alloc添加到副本分配运算符!关于原始问题,我假设编译器无法保留一些额外的工作,以免复制分配构造函数的堆栈展开。这是正确的吗?

标准库使用move_if_noexcept,它返回nothrow的move构造函数不会引发异常。因此,我认为没有缺点,因为move构造函数指定了noexcept。这是正确的吗?

唯一剩下的是this post from Scott Meyers,他提到失去控制权,破坏发生和多余的指针复制。

谢谢

PS:说实话。我无法在原始问题上添加评论,因为它的字符太大。我试图添加一个类似的帖子作为答案,并询问我的假设是否正确。人们不喜欢那样。所以我提出了一个新问题。

0 个答案:

没有答案