我想知道以下代码是否可以安全使用,如果不安全,是否可以使其安全?
{
ThreadState state = ThreadState::Running;
auto pair = std::make_pair(std::async([&state] ()
{
state = ThreadState::Waiting;
}), std::move(state));
someVector.emplace(std::move(pair));
}
执行std::move
后,lambda 会跟踪正确的引用吗?国家的生命周期会延长吗?我可以改进它来创建一对 lambda 及其捕获的状态吗?
最佳答案
Will the lambda keep track of the proper reference after performing std::move?
不,lambda 将引用移出的 state
,该状态现在具有不确定的值。
Will the lifetime of the state be extended?
当封闭范围结束时,state
的生命周期也结束。将 state
的值移至其中的 std::pair
内状态的生命周期当然将由 std::pair 的生命周期决定: :vector
你将其放置/插入。
Can I improve this to create a pair of a lambda and its captured state?
尽管使用动态存储,但一种解决方案是使用 std::unique_ptr
:
{
auto state = std::make_unique<ThreadState>(ThreadState::Running);
vec.emplace_back(
std::async([s = state.get()] ()
{
*s = ThreadState::Waiting;
}),
std::move(state)
);
}
关于c++ - 搬家会保留引用文献吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44516331/