https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116476
Bug ID: 116476 Summary: error: binding reference of type 'int&&' to 'const int' discards qualifiers for std::vector<field<int>> f{2}; (OK under Clang and GCC<=13) Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: nabijaczleweli at nabijaczleweli dot xyz Target Milestone: --- minified reproducer, reduced from the original (https://git.sr.ht/~nabijaczleweli/voreutils/tree/5781698e96ad3a085a2f3d712dc61b020ae287ad/item/cmd/df.cpp#L80): #include <vector> template <class T> struct field { field(T &&) {} }; std::vector<field<int>> fields_normal{2}; // Error std::vector<field<int>> fields_workaround{{2}}; // OK All Clangs I cared to try and GCCs <=13 accept this and do the expected thing. GCC 14 (and trunk according to godbolt) explode with <source>:6:40: error: binding reference of type 'int&&' to 'const int' discards qualifiers 6 | std::vector<field<int>> fields_normal{2}; // Error | ^ <source>:4:11: note: initializing argument 1 of 'field<T>::field(T&&) [with T = int]' 4 | field(T &&) {} | ^~~~ <source>: In function 'void __static_initialization_and_destruction_0()': <source>:6:40: error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'const int' 6 | std::vector<field<int>> fields_normal{2}; // Error | ^ <source>:4:11: note: initializing argument 1 of 'field<T>::field(T&&) [with T = int]' 4 | field(T &&) {} | ^~~~ Compiler returned: 1 which feels nonsensical to me.