https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94062
--- Comment #7 from m.cencora at gmail dot com --- (In reply to Jonathan Wakely from comment #6) > Further reduced: > > struct Bar1 > { > Bar1(Bar1&&) = delete; > }; > > struct Foo1 > { > operator Bar1() const; > }; > > struct tuple : Bar1 > { > tuple() : Bar1(Foo1{}) { } > }; > > tuple t; > > > > elide.cc: In constructor 'tuple::tuple()': > elide.cc:13:24: error: use of deleted function 'Bar1::Bar1(Bar1&&)' > 13 | tuple() : Bar1(Foo1{}) { } > | ^ > elide.cc:3:3: note: declared here > 3 | Bar1(Bar1&&) = delete; > | ^~~~ > > > But I think this may be another instance of PR 82113 and elision shouldn't > be done here. Standard says that if: std::is_constructible_v<Bar, Foo&&> then std::is_constructible_v<std::tuple<Bar>, Foo&&> So I think this is not an instance of PR 82113, but an unfortunate consequence of how tuple is implemented in libstdc++. If tuple elements were not stored as base classes, but as members than elision is mandatory and it would work. But I guess to fix this you would have to break ABI (or change C++ standard).