Вот наша теория о том, что может происходить под капотом:
std::function<bool(int)> DetectPossibilities;
Компилирует (в режиме выпуска) что-то эквивалентное выделению в памяти 64 байта.
DetectPossibilities = [&](int startPos) -> bool {
Назначает новую лямбду, у нее есть захват, и он собирает (в режиме выпуска) 72 байта памяти, но не помещается в то же место в памяти, отсюда и предупреждение. Единственная разница - захват. Поэтому, если мы удостоверимся, что оригинал также имеет захват, то мы сможем обойти эту странную проблему.
std::function<bool(int)> DetectPossibilities = [&](bool){return 0;};
DetectPossibilities = [&](int startPos) -> bool {
Действительно, это ссылки в режиме релиза, позволяющие избежать этих странных ошибок.
Мне кажется, что это ошибка в Visual Studio, потому что это не происходит в отладочной компиляции, и компилятор должен иметь смарт-коды, чтобы иметь возможность обрабатывать этот конкретный шаблон и правильно распределять память.