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