std::bind为何会静默丢弃多余参数且未触发编译报错?
问题原因解释
- 你传入的字符串
"my string"确实被静默丢弃了。 std::bind的设计本身就允许返回的可调用对象接收超出占位符数量的多余参数,所有未被占位符匹配的入参都会被直接忽略,不会触发编译错误,这是C++标准明确规定的行为。
针对代码的具体分析
你定义的TaskFunction类型要求关联的可调用对象可以接收int、const std::string&两个参数:
- 你通过
std::bind生成的可调用对象,仅声明了使用第一个入参的占位符std::placeholders::_1,对应MyClass::myTask需要的int参数 - 调用
tf(0, "my string")时传入的第二个字符串参数,没有对应的占位符需要消费,就被直接丢弃,整个调用逻辑完全符合C++标准要求,因此编译器不会报错。
对比参考
如果换用无泛型的lambda实现相同逻辑,编译器就会触发参数不匹配的错误:
// 下面的代码会编译失败,因为lambda只接收1个参数,无法匹配TaskFunction要求的2个参数 TaskFunction tf = [&mc](int i) { mc.myTask(i); };
这就是std::bind和普通lambda在参数匹配规则上的典型差异。
内容的提问来源于stack exchange,提问作者bzhu
相关产品推荐
相关产品推荐

