#include <iostream>
#include <vector>
using namespace std;
int main() {
int n = 4, m = 3;
auto get = [&]() {
vector<vector<bool>> arr(n, vector<bool>(m, false));
arr[0][0] = true;
return arr[0][0];
};
cout << get() << endl;
}
Этот код возвращает 0
. Пока return arr[0][0] == true
возвращается 1
, что ожидаемо.
Может ли кто-нибудь объяснить проблему, стоящую за этим??
Сюрприз, std::vector<bool>
ведет себя не так, как любая другая специализация std::vector
. std::vector<bool>
упаковывает свои данные так, чтобы каждый элемент мог храниться как один бит. В результате operator[]
возвращает ссылочный объект, который ссылается на блок памяти из вектора, в котором хранится бит.
Именно эту ссылку вы возвращаете из своей функции. Поскольку это ссылка на вектор, а вектора теперь нет, у вас есть висячая ссылка, и доступ к ней имеет неопределенное поведение.
Оглядываясь назад, std::vector<bool>
, вероятно, должен был быть неспециализированным, и вместо этого, если бы у нас был std::vector_bool
. Увы, этот корабль уплыл.
Дополнительная проблема: ничто в этом коде не нуждается в дополнительных вещах, которые делает
std::endl
. Используйте'\n'
, чтобы завершить строку, если у вас нет веской причины не делать этого.