只需从'0'开始迭代 uchar



我只是想把它当作一个循环:

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();
});
}

最新更新