我正在编写一个带有以下函数的互斥保护堆栈,用于在可能失败的情况下从顶部弹出一个值:
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;
}
我使用 astd::vector
作为底层容器。为了将不可复制的 T 存储在堆栈中(例如std::unique_ptr
),我曾经std::move
将 T 从向量的背面取下,否则会进行复制。两个问题:a) 这是正确的吗?T 会被移动还是复制?b) 我担心异常安全。如果移动抛出,则堆栈不会被弹出,但顶部值可能处于半移动状态。这可能吗?我该如何解决?