为什么 std::function 试图在这里调用复制构造函数?

问题描述 投票:0回答:1
#include <functional>
struct MyFoo
{
    MyFoo() {}
    MyFoo(const MyFoo&) = delete;
    MyFoo(MyFoo&&) = default;
    MyFoo& operator=(const MyFoo&) = delete;
    MyFoo& operator=(MyFoo&&) = default;
    void operator()(int) {

    }
};

int main(void)
{
    std::function<void(int)> foo{MyFoo()}; 
}

Error   C2280   'MyFoo::MyFoo(const MyFoo &)': attempting to reference a deleted function   

MyFoo 是一个右值。当需要复制它时,std::function 不应该复制它,而应该移动它。

c++ std-function
1个回答
0
投票

std::function
always 要求提供的可调用类型是可复制构造的。你使用什么成员函数是无关紧要的。

至于实现原因:为了使

std::function
使用的类型擦除起作用,必须在构造时为给定的可调用类型实例化所有可能可用的功能,因为使用站点无法知道这个特定的可调用类型类型可以在
std::function
实例中使用。并且
std::function
允许复制,因此这是相关的。

© www.soinside.com 2019 - 2024. All rights reserved.