https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82222
Bug ID: 82222 Summary: wrong uninitialized reference in lambda capture in fold expression Product: gcc Version: 7.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: benni.buch at gmail dot com Target Milestone: --- int main(){ int dummy = 0; [](auto& d, auto ... args){ ([](auto ...){}(([&d](){}, args)), ...); }(dummy, 0, 0); } is a valid program, but: $ g++ -std=c++17 -o main gcc-test.cpp gcc-test.cpp: In instantiation of 'main()::<lambda(auto:1&, auto:2 ...)> [with auto:1 = int; auto:2 = {int, int}]': gcc-test.cpp:5:15: required from here gcc-test.cpp:4:20: error: member 'main()::<lambda(auto:1&, auto:2 ...)> [with auto:1 = int; auto:2 = {int, int}]::<lambda()>::<d capture>' is uninitialized reference ([](auto ...){}(([&d](){}, args)), ...); ^ I found this while implementing an output function: #include <iostream> #include <tuple> template < typename Arg, typename ... Args > void comma_separated_output( std::ostream& os, Arg const& arg, Args const& ... args ){ std::apply([&os](auto const& ... args)mutable{ (os << ... << args); }, arg); (std::apply([&os](auto const& ... args)mutable{ ((os << ", ") << ... << args); }, args), ...); } int main(){ comma_separated_output(std::cout, std::make_tuple(), std::make_tuple(), std::make_tuple()); } $ g++ -std=c++17 -o main gcc-test.cpp gcc-test.cpp: In instantiation of 'void comma_separated_output(std::ostream&, const Arg&, const Args& ...) [with Arg = std::tuple<>; Args = {std::tuple<>, std::tuple<>}; std::ostream = std::basic_ostream<char>]': gcc-test.cpp:20:64: required from here gcc-test.cpp:13:17: error: member 'comma_separated_output(std::ostream&, const Arg&, const Args& ...) [with Arg = std::tuple<>; Args = {std::tuple<>, std::tuple<>}; std::ostream = std::basic_ostream<char>]::<lambda(const auto:2& ...)>::<os capture>' is uninitialized reference (std::apply([&os](auto const& ... args)mutable{ ^ Tested with: $ g++ --version g++ (GCC) 7.2.1 20170911