为什么不能C ++ 11招一个不可复制的仿函数到一个std ::功能?(Why can't

2019-06-17 14:53发布

//------------------------------------------------------------------------------
struct A
{
    A(){}
    A(A&&){}
    A& operator=(A&&){return *this;}
    void operator()(){}

private:
    A(const A&);
    A& operator=(const A&);

    int x;
};

//------------------------------------------------------------------------------
int main()
{
    A a;
    std::function<void()> func(std::move(a));
}

“A :: A”:不能访问类“A”声明私有成员

好像当我捕捉引用或东西const我可以让一个不可复制的拉姆达。 然而,当我这样做,它的实际工作给它一个std::function

Answer 1:

简短的回答是,C ++ 11规范要求的ACopyConstructible与使用std::function

长的答案是存在这个要求,因为std::function擦除构造函数内仿函数的类型。 要做到这一点, std::function必须通过虚函数访问你的仿函数的某些成员。 这些措施包括调用操作,拷贝构造函数和析构函数。 而且,由于这些都是通过一个虚拟电话访问,他们是“用”您是否真正使用std::function的拷贝构造函数,析构函数或致电运营商。



Answer 2:

这是在Visual Studio中的错误。 它试图ellide副本(而实际上它应该尝试ellide的举动),这需要一个可访问的拷贝构造函数。 最好的解决办法是简单地声明拷贝构造函数/赋值运算符,从不定义它们。 本课程将仍然是不可复制的,但代码编译,因为VS不会尝试实际调用拷贝构造函数。



文章来源: Why can't C++11 move a noncopyable functor to a std::function?