将unique_ptr传递给函数对象

Passing unique_ptr to function object

本文关键字:函数 对象 unique ptr      更新时间:2023-10-16

无法编译下面的代码。我创建了一个函数对象,并尝试传递一个唯一的指针,但编译器抱怨说我试图访问unique_ptr中的私有数据。这发生在msvc 2012 v110中。

class Work
{
};
class A 
{
public:
    void doWork(Work w)
    {
        std::cout << " - - ";
        return;
    }
    void doWork2(std::unique_ptr<Work> w)
    {
        std::cout << " - - ";
        return;
    }
};
int main()
{
    A a;
    std::unique_ptr<Work> w2 = std::unique_ptr<Work>(new Work());
    Work w;
    auto func = std::bind(&A::doWork, a, std::placeholders::_1);
    auto func2 = std::bind(&A::doWork2, a, std::placeholders::_1);
    func(w);
    func2(std::move(w2));
    return 0;
}

这看起来像是VC中的一个bug。参见Microsoft Connect的bug报告。

似乎VC传递占位符参数作为左值引用,而不是使用完美转发。

该示例在gcc上可以很好地编译(coliru上的实时示例)。

作为一种变通方法,您可以使用lambda代替std::bind:

auto func2 = [&a](std::unique_ptr<Work> w) { a.doWork2(std::move(w)); };