http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59070
Bug ID: 59070 Summary: Captured object is being moved from the lambda on returning it. Product: gcc Version: 4.8.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: sir_nawaz959 at yahoo dot com I'm using GCC 4.8.1 Here is the code which reproduces this bug: std::vector<std::string> items {"default"}; auto add = [=](std::string item) mutable { items.push_back(item); return items; }; std::cout << add("one") << std::endl; std::cout << add("two") << std::endl; std::cout << add("three") << std::endl; Imagine that operator<< is overloaded for std::vector which all items on ONE line. The expected out is: default one default one two default one two three But it actually outputs this: default one two three So it seems on the first return, the captured vector is moved. However, if I define the lambda as: auto add = [=](std::string item) mutable { items.push_back(item); auto & x = items; return x; } ; OR as: auto add = [=](std::string item) mutable { auto & x= items; x.push_back(item); return x; } ; It prints the expected output.