C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 异常安全移动物体离开堆叠大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个带有以下函数的互斥保护堆栈,用于从可能失败的顶部弹出一个值:

bool try_pop(T& value)
{
    std::lock_guard<std::mutex> lock(mutex_);
    if (ctr_.empty())
        return false;
    value = std::move(ctr_.BACk());
    ctr_.pop_BACk();
    return true;
}

我正在使用std :: vector作为底层容器.为了在堆栈中存储一个不可复制的T(例如std :: unique_ptr),我使用了std :: move从传感器的背面取下T,否则就会产生一个副本.两个问题:a)这是正确的吗? T会被移动还是被复制? b)我担心异常安全.如果移动抛出,则不会弹出堆栈,但最高值可能处于半移动状态.这是可能的,我该如何解决

解决方法

a)假设它有一个移动构造函数,它将被移动.对于已定义复制构造函数但未定义移动构造函数的类型,将复制它.

b)如果你需要强异常保证,那么你应该使用std :: move_if_noexcept,它只在输入提供noexcept()移动构造函数时启用移动.这样,如果移动构造函数可以抛出,它将诉诸于复制,因此如果抛出异常,则对象在堆栈上保持不变.明确提供了std :: move_if_noexcept,以帮助在这种情况下提供强有力的保证.

编辑:正如HoWARD Hinnant指出的那样,当前的代码示例是使用移动赋值,而不是移动构造,因此std :: move_if_noexcept不太可能做你想要的.要在使用赋值时解决它,您需要编写自己的包装器,它基于std :: move_if_noexcept:

template <class T> typename std::conditional<
!std::is_nothrow_move_assignable<T>::value && std::is_copy_assignable<T>::value,const T&,T&&>::type move_if_assign_noexcept(T& X) noexcept {
   return std::move(X);
}

大佬总结

以上是大佬教程为你收集整理的c – 异常安全移动物体离开堆叠全部内容,希望文章能够帮你解决c – 异常安全移动物体离开堆叠所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。