C++11 8.5.1 [dcl.init.aggr] p1 defines aggregate types:
An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or-equal-initializers for non-static data members (9.2), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).
user-provided is defined in 8.4.2 [dcl.fct.def.default] p4:
... A special member function is user-provided if it is user-declared and not explicitly defaulted or deleted on its first declaration.
Foo
has two user-declared constructors, both of which are explicitly defaulted or deleted on their first declaration, so Foo
is an aggregate.
GCC is wrong.