将unique_ptr传递给函数对象

时间:2014-08-22 09:11:17

标签: c++ c++11

在编译时遇到问题。我创建一个函数对象并尝试传递一个唯一的指针,但编译器抱怨说我正在尝试访问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;
}

1 个答案:

答案 0 :(得分:0)

这看起来像VC中的错误。另请参阅this bug report on Microsoft Connect

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

该示例在gcc(live sample on coliru)上编译正确。

作为一种解决方法,您可以使用lambda而不是std::bind

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