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

Иго*_*нко 2 c++ bind function

为什么带有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;
}
Run Code Online (Sandbox Code Playgroud)

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

Max*_*kin 5

std::bind调用创建的函数对象忽略所有额外的参数.例:

void f(int);

int main() {
    auto a = std::bind(f, 42);
    a();
    a(1);
    a(1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)

您可以将此类对象指定为std::function使用相同或更多数量的参数.同样,额外的参数将被默默地忽略.

C++ 11 lambda更有效,额外的参数会导致编译错误(例如try auto a = []() { f(42); };).