为什么在转换为std :: function时没有编译错误

时间:2018-12-10 14:24:30

标签: c++ function bind

为什么带有p1和p2的行编译正常?

它们的租金类型不同

#include <functional> 
#include <iostream>


void cb(int X)
{
    std::cout << X << "\n";
}

int main(void) {

 std::function<void(void)> p1 = std::bind(cb, 9);
 std::function<void(int)>  p2 = std::bind(cb, 5);    

 //p1 = p2;
}

如果我取消注释p1 = p2行-编译错误

1 个答案:

答案 0 :(得分:6)

std::bind调用创建的功能对象将忽略所有其他参数。示例:

void f(int);

int main() {
    auto a = std::bind(f, 42);
    a();
    a(1);
    a(1, 2, 3);
}

您可以使用相同或更多数量的参数将这样的对象分配给std::function。同样,多余的参数将被静默忽略。

C ++ 11 lambda效率更高,并且多余的参数会导致编译器错误(例如,尝试auto a = []() { f(42); };)。