https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108683
Bug ID: 108683 Summary: Move Occurs when initializing an aggregate base Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: davidledger at live dot com.au Target Milestone: --- ```CPP struct Bar { Bar() = delete; Bar(Bar const &) = delete; Bar& operator=(Bar const&) = delete; Bar(Bar&&) = delete; Bar& operator=(Bar&&) = delete; explicit Bar(int value) : m_value(value) {} int m_value; }; namespace A { struct Foo : Bar{}; // this is the only difference. Bar MakeBar() { return Bar(10); } } namespace B { struct Foo { Bar bar; // this is the only difference. }; Bar MakeBar() { return Bar(10); } } int main() { A::Foo foo{ A::MakeBar() }; B::Foo bar{ B::MakeBar() }; } ``` The above example, while failing similarly in clang and GCC. Compiles without issue on MSVC. As of C++17: > An aggregate class or array may include non-aggregate public bases (since > C++17), members, or elements, which are initialized as described above (e.g. > copy-initialization from the corresponding initializer clause). cppreference. So we have an aggregate here. When using GCC, the following error is presented: ``` <source>: In function 'int main()': <source>:38:30: error: use of deleted function 'Bar::Bar(Bar&&)' 38 | A::Foo foo{ A::MakeBar() }; | ^ <source>:6:5: note: declared here 6 | Bar(Bar&&) = delete; | ^~~ Compiler returned: 1 ``` I believe this should compile without requiring a move constructor of the base type.