如何正确转发unique_ptr?

Dan*_*nra 9 c++ move unique-ptr c++11

通常什么是转发std :: unique_ptr的正确方法?

下面的代码使用std::move,我认为这是考虑的做法,但它与clang崩溃.

class C {
   int x;
}

unique_ptr<C> transform1(unique_ptr<C> p) {
    return transform2(move(p), p->x); // <--- Oops! could access p after move construction takes place, compiler-dependant
}

unique_ptr<C> transform2(unique_ptr<C> p, int val) {
    p->x *= val;
    return p;
}
Run Code Online (Sandbox Code Playgroud)

是否有更强大的约定,而不仅仅是确保p在将所有权转移到下一个功能之前获得所需的一切std::move?在我看来,move在一个对象上使用并访问它以向同一函数调用提供参数可能是一个常见的错误.

Ser*_*eyA 5

因为p在移动之后你真的不需要访问,所以一种方法是p->x在移动之前获取然后使用它.

例:

unique_ptr<C> transform1(unique_ptr<C> p) {
    int x = p->x;
    return transform2(move(p), x);
}
Run Code Online (Sandbox Code Playgroud)

  • @Danra,但你不能.移动后不能使用指针的内容,并且(如注释中所述)如果在函数调用上下文中使用`std :: move`,则在移动对象时它是未定义的.在单线程程序中,您可以获取原始指针并在函数参数中使用它.这是你想要得到的吗? (2认同)