https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114994
Bug ID: 114994 Summary: fmtlib named argument compiler error introduced in g++-14.1 Product: gcc Version: 14.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: andrew.corrigan at gmail dot com Target Milestone: --- Demo: https://godbolt.org/z/oachhYKcT First reported to https://github.com/fmtlib/fmt/issues/3953. The fmtlib author believes the error below is a compiler bug. Using fmtlib's named arguments inside a generic lambda stopped working as of g++-14.1. The reproducer below compiles on every other compiler I've tried (earlier versions of g++, clang++, intel, and msvc) ``` #include <iostream> #define FMT_HEADER_ONLY #include <fmt/format.h> using namespace fmt::literals; int main() { auto test = [&](auto a) { return fmt::format("{foo} {bar}", "foo"_a="foo", "bar"_a="bar"); }; std::cout << test(1) << std::endl; return 0; } ``` Error: ``` <source>:12:50: error: cannot bind non-const lvalue reference of type 'fmt::v10::detail::named_arg<char, const char (&)[4]>&' to an rvalue of type 'fmt::v10::detail::named_arg<char, const char (&)[4]>' 12 | return fmt::format("{foo} {bar}", "foo"_a="foo", "bar"_a="bar"); | ~~~~~~~^~~~~~ ``` Changing `auto a` to `int a` works around the error. Thank you!