C++中std::bind传入解引用迭代器失效,直接传入迭代器却正常的原因解析
问题解析:
std::bind绑定对象副本 vs 原对象的区别 嘿,这个问题刚好能帮你搞懂std::bind处理参数的核心逻辑,咱们一步步来拆解:
1. 为什么用*employee绑定后修改不生效?
当你写bind(&Employee::set_name, *employee, new_value)时,*employee是对迭代器解引用得到的原对象的拷贝——std::bind默认会按值存储所有传入的参数。
这意味着,你绑定的是一个和employee_list里原对象无关的临时副本!后续调用selection(new_value)时,所有修改都只作用在这个副本上,原对象自然不会有任何变化。
2. 直接传迭代器employee为什么能正常工作?
迭代器的本质很像指针,std::bind会存储这个迭代器的副本。当你调用绑定后的函数对象时,它会自动对迭代器做解引用操作(相当于执行(*employee).set_name(...)),这时候操作的是employee_list容器里的原对象,所以修改会直接反映到原数据上。
额外的小问题:你的bind写法有冗余
你在bind的时候已经把new_value作为参数绑定进去了,但后面又调用selection(new_value)——这其实会导致参数重复传递。正确的写法应该用占位符,让函数对象在调用时接收参数,比如:
subMenu = { {"1", bind(&Employee::set_name, std::ref(*employee), std::placeholders::_1)}, {"2", bind(&Employee::set_phone, std::ref(*employee), std::placeholders::_1)}, {"3", bind(&Employee::set_address, std::ref(*employee), std::placeholders::_1)} };
这里用std::ref(*employee)传递原对象的引用(避免拷贝),std::placeholders::_1表示第一个参数会在调用时传入,这样后续selection(new_value)就会把new_value正确传给setter函数。
总结核心知识点
std::bind默认按值保存参数,传递对象时会生成副本;- 传递指针/迭代器时,bind会存储其副本,调用时解引用操作原对象;
- 如果要传递对象的引用给bind,必须用
std::ref或std::cref显式声明。
内容的提问来源于stack exchange,提问作者323 Kobby
相关产品推荐
相关产品推荐

