http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56567
--- Comment #7 from David Krauss <potswa at mac dot com> 2013-03-11 22:42:46 UTC --- Created attachment 29647 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29647 alternative fix Yes. However, the above fix doesn't catch all instances of doing so; for example []() -> std::initializer_list< int >{ return { 1, 2 }; } Worse, one case still results in ICE []() { return std::initializer_list< int >{ 1, 2 }; } Here's an improved fix. It doesn't attempt to catch runtime UB. I think that should be another warning diagnostic, which can also flag such attempted workarounds as reference return types []() -> std::initializer_list< int > && { return { 1, 2 }; } Users are likely to try fiddling after we flag their initial attempt, so we might as well be as broad as possible. However, a specialization of std::min can return a valid std::initializer_list< T > const & : struct s { friend bool operator < ( s lhs, s rhs ) { return false; } friend bool operator < ( std::initializer_list< s > lhs, std::initializer_list< s > rhs ) { return std::lexicographical_compare( lhs.begin(), lhs.end(), rhs.begin(), rhs.end() ); } }; std::min( std::initializer_list< std::initializer_list< s > > { { s(), s(), s() }, { s(), s() } } );