z mojego doświadczenia wydaje się, że albo:C++ Adres obiektów lambda jako parametry do funkcji
- Wyrażenie lambda tworzone wewnątrz wywołania funkcji jest zniszczona tuż po wywołaniu
- wywołanie funkcji, która spodziewa się
std::function
tworzy tymczasowy obiekt (std :: function) z lambda i że obiekt jest niszczony po wywołaniu
Takie zachowanie można zaobserwować na poniższym fragmencie kodu:
const function<void()>* pointer;
void a(const function<void()> & f)
{
pointer = &f;
}
void b()
{
(*pointer)();
}
int main()
{
int value = 1;
std::cout << &value << std::endl;
// 1: this works
function<void()> f = [&]() { std::cout << &value << std::endl; };
a(f);
// 2: this doesn't
a([&]() { std::cout << &value << std::endl; });
/* modify the stack*/
char data[1024];
for (int i = 0; i < 1024; i++)
data[i] = i % 4;
b();
return 0;
}
Co dokładnie dzieje się w drugim przypadku? Czy istnieje poprawny sposób wywoływania a()
bez tworzenia jawnego obiektu std::function
?
Edit:: Ten obie wersje (1 i 2) skompilować tylko prawo ale skutkować różnymi wyjściami:
Wersja 1:
0x7fffa70148c8
0x7fffa70148c8
Wersja 2:
0x7fffa70148c8
0
Co masz na myśli, że drugi przypadek "nie działa"? Czy to się kompiluje? Czy to się psuje? Czy wypisuje "nie działa" na twojej drukarce? – jalf
@jalf: Zapomniałeś: czy to się zatrzymuje i się pali. – Grizzly
/* modyfikowanie stosu */Większość kompilatorów wstępnie przydziela miejsce dla ** wszystkich ** zmiennych lokalnych po wprowadzeniu funkcji. –