http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56568
Bug #: 56568 Summary: std::initializer_list return value contents lost prematurely Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: pot...@mac.com See http://stackoverflow.com/q/15286450/153285 This program segfaults: #include <string> #include <iostream> #include <initializer_list> int main() { for ( auto && s : []() -> std::initializer_list< std::string > { return { std::string( "first" ), std::string( "second" ) }; }() ) std::cout << s << '\n'; } The return value object should be initialized from the braced-init-list, and bound directly to the implicit "auto && __range" object of the range-based for statement. The array backing that object should have the same lifetime as it, namely the duration of the loop. Instead, the array is destroyed when the lambda exits. This is not easy to fix, but I'll just file this.