我只是想把它当作一个循环:
keyboardHandler.register_callback('0', [&](){
buttons.at(0)->pressed();
});
keyboardHandler.register_callback('1', [&](){
buttons.at(1)->pressed();
});
keyboardHandler.register_callback('2', [&](){
buttons.at(2)->pressed();
});
keyboardHandler.register_callback('3', [&](){
buttons.at(3)->pressed();
});
keyboardHandler.register_callback('4', [&](){
buttons.at(4)->pressed();
});
前一个样品做得很好。
所以我基本上试试这个:
for(int i = 0 ; i < 5 ; i ++){
keyboardHandler.register_callback('0' + i, [&](){
buttons.at(i)->pressed();
});
}
当我按下"0"、"1"、…时,会出现以下执行异常我键盘上的4':
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 5) >= this->size() (which is 5)
Abandon (core dumped)
这是我的register_recallback方法:
void register_callback(unsigned char key, std::function<void()> callback){
_registered_callback[key] = callback ;
}
附言:我不认为问题来自代码的深层次,因为没有循环的测试可以完美地工作。
正如@cigien在评论中提到的,您需要在lambda中通过引用来捕获循环计数器变量。我很确定,通过引用捕获超出范围的东西,并且在捕获它的lambda之前它的生命周期结束,这是一个生命周期问题,是UB(但我不是C++语言律师(。
for(int i = 0 ; i < 5 ; i ++){
keyboardHandler.register_callback('0' + i, [i](){
buttons.at(i)->pressed();
});
}