gpt4 book ai didi

c++ - 堆栈可以有一个异常安全的方法来返回和删除具有 move 语义的顶部元素吗?

转载 作者:可可西里 更新时间:2023-11-01 16:16:39 28 4
gpt4 key购买 nike

在对关于 std::stack::pop() 的问题的回答中 I claimed pop 不返回值的原因是出于异常安全原因(如果复制构造函数抛出会发生什么)。

@Konrad评论说现在有了 move 语义,这不再相关。这是真的吗?

据我所知, move 构造函数 can throw , 但也许与 noexcept它仍然可以实现。

对于奖励积分,此操作可以提供哪些线程安全保证?

最佳答案

当然,并非所有类型都支持 move ,C++0x 甚至允许抛出 move 构造函数。只要从右值构造对象可能会抛出它就不可能是异常安全的。但是, move 语义允许您拥有许多在给定右值源的情况下不可抛出构造的类型。

SFINAE 可以为此提供有条件的支持。但即使没有这样的条件成员函数,也没有什么能阻止您编写:

auto stack = ...;
auto elem = std::move_if_noexcept(stack.back());
stack.pop_back();

即使您的 move 构造函数没有提供强有力的保证,它也能提供强有力的异常保证。

关于c++ - 堆栈可以有一个异常安全的方法来返回和删除具有 move 语义的顶部元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2620357/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com