Ich habe folgenden Code-Block, was ich erwartet, ist die i
innerhalb der Lambda-Capture-Liste wird durch Wert übergeben und die i
ausgegeben werden sollte anders sein. Das tatsächliche Ergebnis ist der Ausgang 20 Zeilen von 19 is completed
.Warum hat diese Lambda-Funktion in der Schleife den Parameter nicht als Wert erfasst?
Ich habe versucht, diese Zeile std::thread t([&func](){
zu std::thread t([func](){
zu ändern, der Ausgang könnte verschiedene i
Wert drucken.
Meine Frage ist, warum std::thread t([&func](){
und std::thread t([func](){
die verschiedenen Ausgabewerte von i führen?
void DoSomething(std::function<void()> func)
{
std::thread t([&func](){
//do something
sleep(1);
if (func)
func();
});
t.detach();
}
int main(int argc, const char * argv[]) {
std::mutex mtx;
for (int i = 1 ; i < 20; i ++) {
DoSomething([i, &mtx](){
std::unique_lock<std::mutex> lock(mtx);
std::cout << i << " is completed" << std::endl;;
});
}
sleep(10);
}
bedeutet das, dass die an die DoSomething übergebene Funktion die Informationen über die Erfassungsliste enthält? – 2power10
@ 2power10 Ich bin mir nicht sicher, was Sie fragen. Wenn Sie über Referenz erfassen, müssen Sie sicherstellen, dass das referenzierte Objekt gültig ist, wenn Sie es verwenden, andernfalls ist das Programm nicht definiert. Wertvolle Erfassung ist hier richtig. – molbdnilo