如何将 std::unique_ptr 传递给函数

新手上路,请多包涵

如何将 std::unique_ptr 传递给函数?可以说我有以下课程:

 class A
{
public:
    A(int val)
    {
        _val = val;
    }

    int GetVal() { return _val; }
private:
    int _val;
};

以下不编译:

 void MyFunc(unique_ptr<A> arg)
{
    cout << arg->GetVal() << endl;
}

int main(int argc, char* argv[])
{
    unique_ptr<A> ptr = unique_ptr<A>(new A(1234));
    MyFunc(ptr);

    return 0;
}

为什么我不能将 std::unique_ptr 传递给函数?这肯定是构造的主要目的吗?或者 C++ 委员会是否打算让我回退到原始 C 样式指针并像这样传递它:

 MyFunc(&(*ptr));

最奇怪的是,为什么这是一种通过它的好方法?这似乎非常不一致:

 MyFunc(unique_ptr<A>(new A(1234)));

原文由 user3690202 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

这里基本上有两种选择:

通过引用传递智能指针

void MyFunc(unique_ptr<A> & arg)
{
    cout << arg->GetVal() << endl;
}

int main(int argc, char* argv[])
{
    unique_ptr<A> ptr = unique_ptr<A>(new A(1234));
    MyFunc(ptr);
}

将智能指针移动到函数参数中

请注意,在这种情况下,断言将成立!

 void MyFunc(unique_ptr<A> arg)
{
    cout << arg->GetVal() << endl;
}

int main(int argc, char* argv[])
{
    unique_ptr<A> ptr = unique_ptr<A>(new A(1234));
    MyFunc(move(ptr));
    assert(ptr == nullptr)
}

原文由 Bill Lynch 发布,翻译遵循 CC BY-SA 3.0 许可协议

由于 MyFunc 没有所有权,最好有:

 void MyFunc(const A* arg)
{
    assert(arg != nullptr); // or throw ?
    cout << arg->GetVal() << endl;
}

或更好

void MyFunc(const A& arg)
{
    cout << arg.GetVal() << endl;
}

如果你真的想拥有所有权,你必须移动你的资源:

 std::unique_ptr<A> ptr = std::make_unique<A>(1234);
MyFunc(std::move(ptr));

或直接传递一个右值引用:

 MyFunc(std::make_unique<A>(1234));

std::unique_ptr 没有副本以保证只有一个所有者。

原文由 Jarod42 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题