c++ - 搬家会保留引用文献吗?

标签 c++ move

我想知道以下代码是否可以安全使用,如果不安全,是否可以使其安全?

{
    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/

相关文章:

c++ - 如何在 C++ 中正确初始化对象 vector ?

linux - 如何 move 和编号文件?

c++ - 对右值引用 vector::push_back 函数如何提高效率感到困惑

c++ - 可点击的 Qlabel 如何在 Designer 中使用

java - 是否有理由使用字符串 => 索引到 vector 的映射,而不是字符串 => 对象?

c++ - 模板函数内的断点,Eclipse CDT Kepler

C++ - 构造函数、复制构造函数、 move 构造函数、析构函数

java - move C++ 内存而不复制

java - Android - 文件不会 move 或复制到内部应用程序存储

c++ - 在 C++ 程序运行时加载文件