Я только что нашел неприятную ошибку в своем коде, потому что я захватил константную ссылку на строку по ссылке.К тому времени, когда лямбда была запущена, исходный строковый объект уже давно исчез, а указанное в нем значение было пустым, тогда как цель состояла в том, чтобы он содержал значение исходной строки, отсюда и ошибку.
Что меня сбивает с толку, так это то, что это не вызывало сбой во время выполнения: в конце концов, разве это не должно быть неопределенным поведением, так как afaik есть свисающая ссылка?Более того, если смотреть на id в отладчике, он даже не выглядит как мусор, а просто как правильно сконструированная пустая строка.
Вот тестовый пример;это просто печатает пустую строку:
typedef std::vector< std::function< void() > > functions;
void AddFunction( const std::string& id, functions& funs )
{
funs.push_back( [&id] ()
{
//the type of id is const std::string&, but there
//is no object to reference. UB?
std::cout << id << std::endl;
} );
}
int main()
{
functions funs;
AddFunction( "id", funs );
funs[ 0 ]();
}